2013-06-23 17 views
7

Questa potrebbe essere una domanda semplice per alcuni di voi. Ma mi stavo chiedendo se un std::string è un contenitore. Per container intendo i contenitori come ad esempio std::vector, std::list e std::deque.C++ È uno std :: string un contenitore?

Poiché std::basic_string<> accetta altri tipi di caratteri interi, ma viene anche ottimizzato lavorando con gli array di caratteri. Non mi è chiaro in quale categoria cada.

Questo compilerà:

#include <string> 
#include <iostream> 

int main() { 
    std::basic_string<int> int_str; 
    int_str.push_back(14); 
    return 0; 
} 

Ma con l'aggiunta di questa linea:

std::cout << int_str << std::endl; 

non lo farà. Quindi da questi fatti ho potuto concludere che una std :: basic_string non era pensata per funzionare con altri tipi rispetto ai personaggi.

Potrebbe essere una strana domanda per voi. La ragione per cui ho bisogno di sapere questo è perché sto lavorando su un framework e non sono ancora in grado di determinare in quale categoria una "stringa" sarebbe caduta.

+0

In senso stretto, non fa parte della libreria di contenitori standard. Ma in quale categoria inserirla dipende da cosa si vuole fare con esso: in molti modi, una stringa assomiglia molto ad un contenitore. – juanchopanza

+0

Non è abbastanza generico da essere un contenitore adeguato. Non puoi creare una stringa da 'struct X' o' float'. –

+0

Lo standard ha un concetto 'Contenitore'. Questa è la migliore definizione che possiamo usare per questa domanda. – BoBTFish

risposta

9

Sì, il modello std::basic_string soddisfa tutti i requisiti dello Container concept. Tuttavia, penso che abbia requisiti più severi per il tipo contenuto. Sto solo cercando di scavare esattamente cosa.

(Questo non è Concetti di Bjarne. Proprio il bit di The Standard etichettato "23.2.1 General container requirements".)

+1

Grazie per la risposta e il collegamento al concetto di contenitore. – Tim

1

Beh, è ​​sicuro di dire che non è un contenitore per lo meno non in modo normale si potrebbe pensare di un contenitore std.

L'esempio più semplice è che non è possibile inserire alcun elemento desiderato.

Ma ha qualche classificazione di un contenitore come il fatto che è possibile inserire alcuni dei tipi di base in esso anche se non sono caratteri, e forse la cosa più sorprendente è che è possibile ottenere un iteratore come se fosse era un normale contenitore.

Quindi è un contenimento? Direi di sì ma! non è tutto generoso.

+0

Non puoi mettere tutto ciò che vuoi in alcune cose che normalmente penseresti come "contenitore". Ad esempio, puoi mettere qualcosa in un 'std :: vector' se non è [' LessThanComparable'] (http://en.cppreference.com/w/cpp/concept/LessThanComparable), ma non potresti mettere in un 'std :: set'. – BoBTFish

2

Secondo gli standard (2003,2011) std :: basic_string è un contenitore solo per i tipi di POD. I.e. tipi fondamentali o semplici struct/classes senza costruttori, distruttori o funzioni virtuali. Ma gnu stdlib consente di utilizzare tipi non POD con std :: basic_string. Here è un esempio di funzionamento con tipi basic_string e non POD.

E se quello di rendere il vostro esempio funziona è necessario definire operatore

std::ostream& operator<<(::std::ostream& out, std::basic_string<int> &dat) 
{ 
    out << dat[0]; 
    return out; 
} 

O qualcosa del genere.

Problemi correlati