std::string 和 std::vector 有什么区别<char>?

What are differences between std::string and std::vector<char>?

本文关键字:std lt gt char 什么 string vector 区别      更新时间:2023-10-16

那么主要的区别是什么?在哪些情况下会使用哪些区别?

  • 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用于字符串表示,并具有特定于字符串操作的方法,例如substrcompare

还有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>大致相同的方式实现——事实上,你可以认为它在概念上是相同的——但在实践中,有几个重要的区别:

  1. C++11引入了一个要求,即std::string需要在内部存储以NUL结尾的字符序列。这使它符合要求,并使与C风格字符串的互操作变得更容易。显然,std::vector<char>不会有与之相关的需求,您也不希望它这样做

  2. 与CCD_ 30相比,CCD_。虽然后者只是一个无聊的旧元素序列,但前者实际上是为了表示字符串而设计的,因此提供了各种与字符串相关的便利功能。(有些人会认为太多,而倾向于将这些函数作为独立的"自由"函数来实现,而不是作为特殊的"字符串"类的成员函数来实现。)

  3. CCD_ 31的常见实现将使用称为";"小字符串优化(SSO)";,这避免了在存储将直接适合CCD_ 32对象实例的字符串时的动态内存分配。在std::vector<>中找不到这种优化(尽管它实际上可以在自定义向量类型中实现)。

    而且,为了实现小字符串优化,标准要求交换std::string使其迭代器无效。该要求不适用于std::vector<>

  4. 尽管现在可能只是历史上的好奇(尤其是因为在实践中几乎没有标准库的实现以这种方式工作),但在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,则可以使用此选项。