Каковы различия между std::string и std::vector <char>?
Итак, каковы основные различия и какие из них будут использоваться в каких случаях?
Ответы
Ответ 1
-
vector<char>
дает вам гарантию, что &v[0]+n == &v[n]
, в то время как строка не работает (практически, это так, но нет гарантии)... AFAIK С++ 0x дает эту гарантию уже
- нет неявного преобразования от
const char*
до vector<char>
Строка - не является контейнером STL. Например, он не имеет функций
pop_back()
или back()
- И последнее, но не менее важное: разные функции-члены! Строка дает вам функции, подходящие для строк, например, возвращать строку с нулевым завершением с помощью
c_str()
Нижняя строка: Используйте string
, когда вам нужно работать со строками. Используйте vector<char>
, когда вам нужен... ну, вектор отдельных символов...
Другое использование vector<char>
- это способ избежать специализации vector<bool>
.
Ответ 2
std:string
используется для строкового представления и имеет методы, специфичные для манипулирования строками, например, substr
и compare
.
А также у вас есть метод c_str
, который вернет указатель на действительную строку "C", которую вы можете использовать в качестве параметра для функций, которые принимают только параметр const char*
as, потому что это гарантирует, что возвращаемая строка заканчивается нулем.
std::vector<char>
будет только массивом символов, и самая большая проблема заключается в том, что у вас нет метода c_str
, поэтому вы не можете передать его как параметр для функций, которые принимают const char *
, если вы не позаботитесь о сохраняя 0 в конце вектора все время.
Ответ 3
std::string
оптимизирован для типичных операций обработки строк, см., например, последний раздел http://www.cplusplus.com/reference/string/string/ "Строковые операции".
std::vector
является общим контейнером для данных любого типа, а не только символами, и, следовательно, не имеет конкретной поддержки того, что люди обычно делают только со строками символов.
Функции, предназначенные для работы с символьными строками, обычно поддерживают string
, но не vector<char>
.
Ответ 4
Почему вы хотите сравнить эти разные типы данных? std::string
- это библиотека, обеспечивающая простую обработку строки следующим образом:
std::string myString;
myString = "My Funny Text";
size_t startOfFunny = myString.find("Funny");
Для std::vector
нет функций управления строкой, поскольку это только тип контейнера. Вы использовали бы это, если вам нужно хранить char
независимо друг от друга.