2010-03-17 10 views
1

J'ai une std :: map:chaîne littérale passant à std :: carte :: find (..)

std::map<std::string, std::string> 

Je passe chaîne littérale à la méthode trouver. De toute évidence, je peux passer une chaîne littérale, comme

.find("blah"); 

Cependant, je voulais déclarer dès le départ, au lieu de coder la chaîne, donc j'ai deux choix maintenant:

const std::string mystring = "blah"; 
const char mystring[] = "blah"; 
static const char * mystring = "blah"; 

Ils travaillent tous . (ou au moins compiler). Ma question est, laquelle dois-je utiliser? quel est l'avantage/distavantage de l'autre?

+1

Comment déclarez-vous votre carte? – Bill

+5

Tout va bien, sauf que j'irais avec le premier: 'const std :: string mystring =" blah ";'. C'est un choix subjectif. – AraK

Répondre

2

Avantages et disadvantatges:

const std::string mystring = "blah";

C'est à peu près la manière standard C++ pour traiter avec des chaînes. Vous pouvez faire tout ce que vous pourriez avoir à faire avec une chaîne avec ceci. Le principal inconvénient est qu'il est plus lent. Il y a une allocation dynamique là-dedans. En outre, si .find repose sur char[] sous les scènes, vous perdez tout ce tas de travail, et il peut même avoir à faire plus pour obtenir la matrice c-utilisable en interne.

const char mystring[] = "blah";

Cette chaîne alloue votre 5 octets sur la pile, il est donc agréable et rapide. L'inconvénient est que si .find utilise std :: string, il va devoir faire cette allocation de toute façon, et il le fera tous les appels au lieu d'une seule fois ici. De plus, si vous deviez faire autre chose avec lui (par exemple: catenate ".txt"), cela aurait été beaucoup plus facile avec une chaîne std :: string.

static const char * mystring = "blah";

Si tel est portée externe, cela signifie qu'il reste local à votre fichier source. La méthode C++ pour ce faire est avec des espaces de noms sans nom au lieu de static cependant. Le seul avantage de le faire de cette façon est qu'il est compatible avec C (ou du moins avec de nouveaux compilateurs qui savent ce que "const" est).

En général, j'irais avec std :: string. Sauf dans des cas spéciaux ou extrêmes, la facilité d'utilisation l'emporte sur la vitesse.

+0

c'est une carte: std :: map , toujours pas sûr, si elle est convertie en char [] – ra170

+1

Si vous ne savez pas, j'irais probablement avec std :: chaîne. –

2

(Cela suppose la key_type de votre map est std::string)

Je vais avec une option que vous n'avez pas spécifié:

static const std::string mystring("blah"); 

De cette façon, la chaîne est à la fois en lecture seule et initialisé juste une fois.

0

Je préférerais

const char * const mystring = "blah"; 
6

votre carte est Si l'on suppose par calée std::string (que je pense qu'il doit être pour les trois choix à la compilation), la première est plus efficace. Vous allez créer un seul objet chaîne et le transmettre par référence à chaque appel à find. Les autres provoqueront la création d'un objet chaîne temporaire pour chaque find.

Questions connexes