[map]poprawna osbługa
Ostatnio zmodyfikowano 2015-11-01 22:45
txter Temat założony przez niniejszego użytkownika |
[map]poprawna osbługa » 2015-11-01 21:59:41 Witam, w moim kodzie dokonałem kilka poprawek przez co program przestał prawidłowo działać. Mianowicie - mam daną zmienną: std::map < const char *, Buffer *> buff_s;
Do tej pory sprawdzałem czy dana jest zawarta w buff_s za pomocą fragmentu: char filename[] = "test.txt"; if( buff_s[ filename ] == NULL ) {...}
Pierwsze pytanie: czy takie coś jest poprawne? Zależy mi na jak najszybszym działaniu programu, zatem czy muszę koniecznie używać: char filename[] = "test.txt"; if( buff_s.find( filename ) == buff_s.end() ) {...}
? -------------------- Drugie pytanie: Dodawałem nową daną za pomocą fragmentu: void JakasKlasa::LoadFile( const char * filename ) { JakasKlasa::buff_s[ filename ] = new Buffer(); }
Problem w tym, że w poprawionym kodzie argument funkcji LoadFile był typu std::string, więc tworzenie nowego obiektu Buffer wyglądało tak: void JakasKlasa::LoadFile( std::string filename ) { JakasKlasa::buff_s[ filename.data() ] = new Buffer(); }
Tu pojawił się problem, ponieważ "filename.data()" (std::string) to nie to samo co "filename" (const char*). Jak rozwiązać ten problem? Trzecie pytanie: Czy nowy obiekt do mapy powinienem dodawać tak: JakasKlasa::buff_s.insert( std::pair < const char *, Buffer *>( filename, new Buffer() ) );
? |
|
j23 |
» 2015-11-01 22:45:38 Ad 1. czy takie coś jest poprawne? |
Błędem to nie jest, ale operator [] dodaje wartość o podanym kluczu, jeśli taka nie istnieje. Zatem użycie [] w warunku nie jest dobrym pomysłem. Opcja z 'find' jest najoptymalniejsza (zresztą operator[] też najpierw szuka klucza). Ad 2. zamiast klucza 'const char*' daj 'std::string'. Ad 3. możesz użyć wspomnianego wcześniej operatora []. |
|
« 1 » |