那么主要的差异是什么?在哪些情况下会使用哪些?
答案 0 :(得分:19)
vector<char>
为您提供&v[0]+n == &v[n]
保证,而字符串不保证(实际情况是这样,但不保证)... AFAIK C ++ 0x已经提供了保证const char*
到vector<char>
pop_back()
或back()
函数c_str()
底线: 当您需要使用字符串时,请使用string
。当你需要一个......好吧,个别字符的矢量......时,请使用vector<char>
。
vector<char>
的另一种用途是避免vector<bool>
专业化的方法。
答案 1 :(得分:4)
std:string
用于字符串表示,并具有特定于字符串操作的方法,例如substr
和compare
。
此外,您还有c_str
方法将返回指向有效“C字符串”的指针,您可以将其用作仅以const char*
作为参数的函数的参数,因为它将保证返回的字符串为零终止。
std::vector<char>
只是一个字符数组,最大的问题是因为你没有c_str
方法,所以你不能将它作为参数传递给const char *
的函数,除非你一直在向量的末尾保持0。
答案 2 :(得分:3)
可以像使用std::vector<char>
一样使用std::string
,但事实并非如此。
std::vector<char>
仅存储字符序列,但并非所有字符序列都是字符串。考虑二进制数据,该数据将正确存储在std::vector<char>
(或std::vector<unsigned char>
)中;将其存储在字符串中没有任何意义。
在内部,std::string
的实现方式与std::vector<char>
几乎相同,实际上,您可以在概念上将其视为相同,但是,实践中,有一些重要的区别:
C++11 introduced the requirement that a std::string
is required to store a NUL-terminated sequence of characters internally。这使其符合法规要求,并使与C样式字符串的互操作更加容易。显然,std::vector<char>
不会与该要求相关联,并且您也不想这样做。
std::string
相比, std::vector<>
提供了截然不同的界面。后者只是一个无聊的旧元素序列,而前者实际上是设计用来表示字符串的,因此提供了各种与字符串相关的便捷功能。 (有些人会争论too many,如果它们是作为独立的“免费”函数而不是特殊的“字符串”类的成员函数实现的,则更愿意这样做。)
std::string
的通用实现将使用称为"small string optimization (SSO)"的优化,当您存储直接适合std::string
对象实例的字符串时,该优化避免了动态内存分配。您不会在std::vector<>
中找到这种优化(尽管it could actually be implemented in a custom vector type)。
并且,为了启用小字符串优化,该标准要求交换std::string
会使其迭代器无效。该要求不适用于std::vector<>
。
尽管现在也许只是出于历史原因(特别是因为几乎没有标准库的实现在实践中以这种方式工作),但是在C ++ 03和语言标准的早期版本中,std::string
是<不需要将字符存储在字符串中的连续内存中。换句话说,它实际上不一定要实现为数组的包装器。这允许在引擎盖下使用rope data structure和/或写时复制策略。 std::vector<>
总是需要连续存储其元素。 (C ++ 11对std::string
引入了相同的要求。)
答案 3 :(得分:2)
std::string
针对典型的字符串处理操作进行了优化,例如, http://www.cplusplus.com/reference/string/string/“字符串操作”的最后一部分。
std::vector
是任何类型数据的通用容器,不仅仅是字符,因此没有特别支持人们通常只使用字符串。
用于处理字符串的函数通常支持string
但不支持vector<char>
。
答案 4 :(得分:1)
为什么要比较这些不同的数据类型? std::string
是一个库,提供如下简单的字符串处理:
std::string myString;
myString = "My Funny Text";
size_t startOfFunny = myString.find("Funny");
std::vector
没有字符串操作函数,因为它只是一种容器。如果您需要彼此独立存储char
,则可以使用此方法。