2009-11-24 5 views

Répondre

13

Il est un typedef de std::basic_string<char>, en fait. std::basic_string est une classe de conteneur spécialement conçue pour les opérations de chaînes. Ce conteneur peut également être utilisé pour les caractères larges (wchar_t); pour ce cas, son typedef serait wstring.

3

std :: string est un basic_string. Ce n'est pas nécessairement un char, mais il doit suivre les ombles traits http://www.cplusplus.com/reference/string/char_traits/

+0

Non, 'std :: string' est un' std :: basic_string , std :: allocateur > ', qui est strictement restreint' char'. –

4

std :: string comme typedef pour basic_string<char, std::char_traits<char>, std::allocator<char> > est à peu près limitée au type char.

Cependant, je ne pense pas que se basic_string est nécessairement limitée aux seuls types de caractères (bien que, comme son nom l'indique, il pourrait être destiné à être utilisé pour les données de chaîne).

#include <string> 
#include <cassert> 

int main() 
{ 
    std::basic_string<int> numbers_1, numbers_2; 
    numbers_1 += 1; 
    numbers_2 += 2; 
    std::basic_string<int> numbers_3 = numbers_1 + numbers_2 + 3; 
    unsigned pos = numbers_3.find(10); 
    assert(pos == std::basic_string<int>::npos); 
} 
5

A std::basic_string<> est une classe qui est très semblable à un conteneur de séquence. Notez que std::basic_string peut contenir n'importe quel type de POD, pas seulement des éléments de type char (qui est ce qu'un std::string est) ou wchar_t (std::wstring).

Je pense qu'un basic_string supporte toutes les opérations d'un conteneur de séquence. Cependant, notez que, par définition, un type de conteneur peut contenir tous les types assignables et reproductibles par copie - pas seulement les types POD. Donc, un basic_string ressemble beaucoup à un conteneur, mais à proprement parler, ce n'est pas un conteneur.

En d'autres termes il y a des types qui peuvent être utilisés avec un récipient qui ne peut pas être utilisé avec un basic_string. Mais pour les types qui peuvent être utilisés avec un basic_string, le std::basic_string fournit l'interface complète d'un conteneur de séquence (je pense) plus des fonctionnalités supplémentaires.

+0

Michael, s'il vous plaît corriger si je me trompe. Votre réponse semble contradictoire avec ces affirmations. - Notez que std :: basic_string peut contenir n'importe quel type de POD, pas seulement des éléments de type char. - il existe des types qui peuvent être utilisés avec un conteneur qui ne peut pas être utilisé avec une chaîne_basique. La question est maintenant de savoir si std :: basic_string peut contenir n'importe quel type, primitif ou non. Si oui, seulement alors std :: basic_string se comporte comme un vrai conteneur STL. – Ankur

+0

@Ankur - Je ne suis pas exactement sûr de ce que vous demandez. 'basic_string <>' ne peut pas contenir de types non-POD qu'un conteneur comme 'vector <>' pourrait contenir. Mais pour les types POD (comme une struct simple), vous pouvez avoir un 'std :: basic_string '. Pour être honnête, je vais juste par ce que dit la norme - il semble qu'après un peu d'expérimentation, certains compilateurs (GCC 3.4.5 et Comeau) accepteront au moins des types non-POD simples comme type utilisé pour 'basic_string <> 'et certains compilateurs n'accepteront pas un type agrégé POD simple (Digital Mars, VC6). VC9 se comporte comme la norme semble exiger. –

+0

@Michael. Ok, je pense que je l'ai maintenant. BTW, que signifie le type POD. Cela signifie-t-il des types de données primitifs (tels que int, char) ou plus? – Ankur

Questions connexes