Каковы различия между 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 независимо друг от друга.