CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - C++ STL map ale bez sortowania

C++ STL map ale bez sortowania

dział ogólny

C++ STL map ale bez sortowania

Nowy postprzez Darek_C++ » poniedziałek, 23 lipca 2012, 19:51

Taki kod:
KOD cpp:     UKRYJ  
map<String,String> myMap;
        map<String,String>::iterator iter;
        myMap["klucz"] ="costam";
        myMap["ble"] = "costam2";
        myMap["ble"] = "costam2";
        myMap["ble"] = "costam2";
        myMap["aassble"] = "costam2";
        myMap["jakaś kategoria testowa"] = "costam2";

        for( iter = myMap.begin(); iter != myMap.end(); ++iter )
        {
                Memo2->Lines->Add( (*iter).first  +":"+ (*iter).second );
        }
I dane się sortują :
aassble:costam2
ble:costam2
jakaś kategoria testowa:costam2
klucz:costam
i to jest niepożądane. Czy jett kontener o funkcji klucz : wartość , ale bez automatycznego sortowania ?

Chodzi o to, że w metodzie która zwraca typ map map<String,String> ObslugaSQLite::getMemoryDoJakichDodacRootCzySaMap(); wstawiam dane w pewne kolejności i iterując przez dane z map chciał bym mieć taką samą kolejność w jakiej wstawiłem , a nie automatycznie posortowaną :(
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez Cyfrowy Baron » wtorek, 24 lipca 2012, 00:02

Możesz użyć THashedStringList lub po prostu TStringList: http://programowanie.cal.pl/cyfbar/listbox.html#listbox3

W podanej lokalizacji opisana została klasa THashedStringList, ale TStringList działa dokładnie tak samo. Nie pamiętam już jaka jest różnica między nimi. THashedStringList używa chyba wewnętrznej tabeli hash i jest chyba po prosu wydajniejsza, gdy lista zawiera bardzo dużo elementów.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez Darek_C++ » wtorek, 24 lipca 2012, 00:08

Ale TStringList przechowuje "jedna" wartość, a nie parę "klucz" - "wartość" jak STL map.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez Cyfrowy Baron » wtorek, 24 lipca 2012, 00:42

Widzę, że nie zrozumiałeś, więc niech kod ci to rozjaśni:

KOD cpp:     UKRYJ  
                TStringList *myMap = new TStringList;


                myMap->Add("klucz=costam");
                myMap->Add("ble=costam2");
                myMap->Add("ble=costam2");
                myMap->Add("ble=costam2");
                myMap->Add("aassble=costam2");
                myMap->Add("jakaś kategoria testowa=costam2");


                for( int x = 0; x < myMap->Count; x++)
                {
                 String key = myMap->Names[x];
                 String value = myMap->Values[ key ]; /* lub value = myMap->ValueFromIndex[x] */

                 Memo1->Lines->Add( key  + ":" + value );
                }

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Darek_C++
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez Darek_C++ » wtorek, 24 lipca 2012, 08:45

Nie wiedziałem, że TStringList obsługuje taki format klucz=wartosc mysalem, że Masz na myśli później dalsze rozbicie po znaku "=" :)

Zrobiłem to już w oparciu o strukturę :
KOD cpp:     UKRYJ  
struct STDaneKN
{
        String id;
        String nazwa;
        String temp;
};
//i STL vector.
vector<STDaneKN> ObslugaSQLite::getMemoryDoJakichDodacRootCzySaStruct() ;

 
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez Darek_C++ » wtorek, 24 lipca 2012, 09:07

Będą przy temacie zapytam czy takie wywołanie metody jest prawidłowe jak chodzi o uniknięcie "wycieku pamięci" z uwagi na new :
KOD cpp:     UKRYJ  
/// Form1.h
private:
   TStringList *__fastcall DoTest(void);

/// Form1.cpp
TStringList *__fastcall TForm4::DoTest()
{
        TStringList *myMap = new TStringList;
        myMap->Add("klucz=costam");
        myMap->Add("ble=costam2");
        myMap->Add("ble=costam2");
        myMap->Add("ble=costam2");
        myMap->Add("aassble=costam2");
        myMap->Add("jakaś kategoria testowa=costam2");
        return myMap;
}

void __fastcall TForm4::Button7Click(TObject *Sender)
{
        TStringList * myMap = DoTest();
        for( int x = 0; x < myMap->Count; x++)
        {
                String key = myMap->Names[x];
                String value = myMap->Values[key];
                Memo2->Lines->Add( key  + " : " + value );
        }
        delete myMap; myMap = NULL;
}
 
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez Cyfrowy Baron » wtorek, 24 lipca 2012, 09:20

Masz chyba wyciek pamięci w funkcji DoTest, gdyż obiekt zostaje porzucony.
Sugerowałbym raczej coś takiego:

KOD cpp:     UKRYJ  
void __fastcall TForm1::DoTest(TStringList *myMap)
{
                myMap->Add("klucz=costam");
                myMap->Add("ble=costam2");
                myMap->Add("ble=costam2");
        myMap->Add("ble=costam2");
                myMap->Add("aassble=costam2");
                myMap->Add("jakaś kategoria testowa=costam2");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
                TStringList *myMap = new TStringList();

                DoTest(myMap);

                for( int x = 0; x < myMap->Count; x++)
                {
                                String key = myMap->Names[x];
                                String value = myMap->Values[key];
                Memo1->Lines->Add( key  + " : " + value );
                }
                delete myMap; myMap = NULL;
}


lub takiego:

KOD cpp:     UKRYJ  
#include <memory>
TStringList *__fastcall TForm1::DoTest(void)
{
                std::auto_ptr<TStringList> myMap(new TStringList);

                myMap->Add("klucz=costam");
                myMap->Add("ble=costam2");
                myMap->Add("ble=costam2");
        myMap->Add("ble=costam2");
                myMap->Add("aassble=costam2");
                myMap->Add("jakaś kategoria testowa=costam2");

                return myMap.release();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
                TStringList *myMap = DoTest();
                for( int x = 0; x < myMap->Count; x++)
                {
                                String key = myMap->Names[x];
                                String value = myMap->Values[key];
                Memo1->Lines->Add( key  + " : " + value );
                }
                delete myMap; myMap = NULL;
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Darek_C++
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez Darek_C++ » wtorek, 24 lipca 2012, 09:33

Cyfrowy Baron napisał(a):Masz chyba wyciek pamięci w funkcji DoTest, gdyż obiekt zostaje porzucony.
Właśnie taki sposób gdzie w metodzie jest new, ale nie ma dalete był opisany w książce http://helion.pl/ksiazki/c-builder-i-tu ... cbuipo.htm Dlatego chciałem się upewnić czy jest to prawidłowe postępowanie jak chodzi o wyciek pamięci.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez Cyfrowy Baron » wtorek, 24 lipca 2012, 10:12

Można trochę prościej:

KOD cpp:     UKRYJ  
#include <memory>
TStringList *__fastcall TForm1::DoTest(void)
{
 std::auto_ptr<TStringList> myMap(new TStringList);

 myMap->Add("klucz=costam");
 myMap->Add("ble=costam2");
 myMap->Add("ble=costam2");
 myMap->Add("ble=costam2");
 myMap->Add("aassble=costam2");
 myMap->Add("jakaś kategoria testowa=costam2");

 return myMap.release();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 int y = DoTest()->Count;
 for( int x = 0; x < y; x++ )
 {
   String key = DoTest()->Names[x];
   String value = DoTest()->Values[key];
   Memo1->Lines->Add( key  + " : " + value );
 }
}




Przetestowałem podany przez Ciebie na wstępie sposób i nie ma tam wycieku pamięci, gdyż rzutujesz obiekt funkcji na nowy obiekt poza funkcją, a potem go niszczysz, więc de-facto obiekt zostaje zniszczony.



Jeszcze jedna ciekawostka, nie wiem czy się przyda, ale działa w odniesieniu do kodu, który tutaj omawiamy:

KOD cpp:     UKRYJ  
#include <memory>

TStringList *__fastcall TForm1::DoTest(void)
{
 std::auto_ptr<TStringList> myMap(new TStringList);

 myMap->Add("klucz=costam");
 myMap->Add("ble=costam2");
 myMap->Add("ble=costam2");
 myMap->Add("ble=costam2");
 myMap->Add("aassble=costam2");
 myMap->Add("jakaś kategoria testowa=costam2");

 return myMap.release();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{

 Memo1->Lines->AddStrings( DoTest() );
 Memo1->Text = StringReplace(Memo1->Text, "=", ":", TReplaceFlags() << rfReplaceAll);

}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez polymorphism » wtorek, 24 lipca 2012, 10:47

Można trochę prościej:

To, że użyjesz auto_ptr, nie oznacza, że nie jesteś narażony na wyciek pamięci. Akurat przykład, który podałeś powoduje wyciek:
KOD cpp:     UKRYJ  
TStringList *__fastcall TForm1::DoTest(void)
{
        std::auto_ptr<TStringList> myMap(new TStringList);

        ...
        return myMap.release(); // <--- obiekt poza kontrolą auto_ptr
}

...

int y = DoTest()->Count; // <--- wyciek!!!
...
 


Kod, który podał Darek_C++ w tym poscie jest poprawny, ponieważ obiekt jest pod koniec usuwany.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Darek_C++
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez Cyfrowy Baron » wtorek, 24 lipca 2012, 10:53

polymorphism napisał(a):Kod, który podał Darek_C++ w tym poscie jest poprawny, ponieważ obiekt jest pod koniec usuwany.


Cyfrowy Baron napisał(a):Przetestowałem podany przez Ciebie na wstępie sposób i nie ma tam wycieku pamięci, gdyż rzutujesz obiekt funkcji na nowy obiekt poza funkcją, a potem go niszczysz, więc de-facto obiekt zostaje zniszczony.




polymorphism napisał(a):Akurat przykład, który podałeś powoduje wyciek:


No właśnie pewien nie byłem, ale jak przekazać taki obiekt poza funkcję, tak by sam po sobie posprzątał?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez polymorphism » wtorek, 24 lipca 2012, 10:56

Zamiast zwracać goły wskaźnik, zwróć obiekt klasy auto_ptr.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez Cyfrowy Baron » wtorek, 24 lipca 2012, 11:00

Jak?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez Cyfrowy Baron » wtorek, 24 lipca 2012, 11:35

Z testów wynika, że release jednak zwalnia obiekt:

KOD cpp:     UKRYJ  
#include <memory>

std::auto_ptr<TStringList> myMap(new TStringList);

TStringList *__fastcall TForm1::DoTest(void)
{
 myMap->Add("klucz=costam");
 myMap->Add("ble=costam2");
 myMap->Add("ble=costam2");
 myMap->Add("ble=costam2");
 myMap->Add("aassble=costam2");
 myMap->Add("jakaś kategoria testowa=costam2");

 return  myMap.release();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{

 Memo1->Lines->AddStrings( DoTest() );
 Memo1->Text = StringReplace(Memo1->Text, "=", ":", TReplaceFlags() << rfReplaceAll);

 if( myMap.get() == NULL) ShowMessage("Brak obiektu"); /* otrzymuję ten komunikat */
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ STL map ale bez sortowania

Nowy postprzez polymorphism » wtorek, 24 lipca 2012, 12:16

Cyfrowy Baron napisał(a):Jak?

Tak, jak napisałem:
KOD cpp:     UKRYJ  
std::auto_ptr<TStringList> __fastcall TForm1::DoTest(void)
{
        std::auto_ptr<TStringList> myMap( new TStringList );

        ...
        return myMap;
}


Z testów wynika, że release jednak zwalnia obiekt:

Nie, z testów wynika, że release działa jak należy ;) release uwalnia wskaźnik spod kontroli obiektu klasy auto_ptr (sam obiekt jest "zerowany"), ale nie usuwa obiektu spod tego wskaźnika (to robi metoda reset lub destruktor).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości