std::string 和 std::vector 有什么区别<char>?
What are differences between std::string and std::vector<char>?
那么主要的区别是什么?在哪些情况下会使用哪些区别?
vector<char>
为&v[0]+n == &v[n]
提供了一个保证,而字符串没有(实际上是这样,但没有保证)。。。AFAIK C++0x已经给出了保证- 不存在从
const char*
到vector<char>
的隐式转换 - 字符串不是STL容器。例如,它没有
pop_back()
或back()
功能 - 最后,但并非最不重要的是,不同的成员功能!字符串为您提供了适合字符串的函数,例如使用
c_str()
返回以null结尾的字符串
底线:
当您需要使用字符串进行操作时,请使用string
。需要时使用vector<char>
。。。好吧,单个字符的矢量。。。
CCD_ 10的另一个用途是避免CCD_。
std:string
用于字符串表示,并具有特定于字符串操作的方法,例如substr
和compare
。
还有c_str
方法,它将返回一个指向有效"C字符串"的指针,您可以将该指针用作仅以const char*
为参数的函数的参数,因为它将保证返回的字符串以零结尾。
std::vector<char>
将只是一个字符数组,最大的问题是因为您没有c_str
方法,所以您不能将其作为使用const char *
的函数的参数传递,除非您一直在向量的末尾保留0。
可以像使用std::string
一样使用std::vector<char>
,但事实并非如此。
std::vector<char>
只存储字符序列,但并非所有字符序列都是字符串。考虑二进制数据,它将被正确地存储在std::vector<char>
(或std::vector<unsigned char>
)中;将其存储在字符串中是没有意义的。
在内部,std::string
可以以与std::vector<char>
大致相同的方式实现——事实上,你可以认为它在概念上是相同的——但在实践中,有几个重要的区别:
-
C++11引入了一个要求,即
std::string
需要在内部存储以NUL结尾的字符序列。这使它符合要求,并使与C风格字符串的互操作变得更容易。显然,std::vector<char>
不会有与之相关的需求,您也不希望它这样做 -
与CCD_ 30相比,CCD_。虽然后者只是一个无聊的旧元素序列,但前者实际上是为了表示字符串而设计的,因此提供了各种与字符串相关的便利功能。(有些人会认为太多,而倾向于将这些函数作为独立的"自由"函数来实现,而不是作为特殊的"字符串"类的成员函数来实现。)
-
CCD_ 31的常见实现将使用称为";"小字符串优化(SSO)";,这避免了在存储将直接适合CCD_ 32对象实例的字符串时的动态内存分配。在
std::vector<>
中找不到这种优化(尽管它实际上可以在自定义向量类型中实现)。而且,为了实现小字符串优化,标准要求交换
std::string
使其迭代器无效。该要求不适用于std::vector<>
。 -
尽管现在可能只是历史上的好奇(尤其是因为在实践中几乎没有标准库的实现以这种方式工作),但在C++03和以前版本的语言标准中,
std::string
是将字符串中的字符存储在连续内存中所必需的,而不是。换句话说,它实际上不必实现为数组的包装器。这允许在后台使用类似于rope数据结构和/或写时复制策略的东西。std::vector<>
的元素总是需要连续存储。(C++11对std::string
提出了相同的要求。)
std::string
针对典型的字符串处理操作进行了优化,请参见http://www.cplusplus.com/reference/string/string/"字符串操作"。
std::vector
是任何类型数据的通用容器,而不仅仅是字符,因此它不支持人们通常只处理字符串。
用于处理字符串的函数通常支持string
,但不支持vector<char>
。
为什么要比较这些不同的数据类型?std::string
是一个库,提供简单的字符串处理,如下所示:
std::string myString;
myString = "My Funny Text";
size_t startOfFunny = myString.find("Funny");
std::vector
没有字符串操作函数,因为它只是一种容器类型。如果需要存储彼此独立的char
,则可以使用此选项。
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- std::vector::reserve(未知m),我知道m<<;N(通常)并且知道N
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- C++运算符<<调用::ostream而不是std::osttream
- 是std :: set&lt; std :: future&gt;不可能存在
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- C++重载<<具有typedef'd std::vector
- 以x的倍数填充前导零,使用std::cout<<std::十六进制
- 错误:没有匹配'运算符<<"在'std::cout
- std::pair的默认构造函数<>将基本类型(int等)设置为零
- std::ostream&operator< & lt; (std:: ostream&压力,压力& &;val)
- 将std::endl传递给std::operator<<
- std::映射<>或std::vector<>在处理大型标志集时
- 重载& lt; & lt;使用命名空间std