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

时间:2011-07-01 12:26:04

标签: c++

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

5 个答案:

答案 0 :(得分:19)

  • vector<char>为您提供&v[0]+n == &v[n]保证,而字符串不保证(实际情况是这样,但不保证)... AFAIK C ++ 0x已经提供了保证
  • 没有从const char*vector<char>
  • 的隐式转换
  • string不是STL容器。例如,它没有pop_back()back()函数
  • 最后,但并非最不重要的是,不同的会员功能! String为您提供适合字符串的函数,例如returnig带有c_str()
  • 的以null结尾的字符串

底线: 当您需要使用字符串时,请使用string。当你需要一个......好吧,个别字符的矢量......时,请使用vector<char>

vector<char>的另一种用途是避免vector<bool>专业化的方法。

答案 1 :(得分:4)

std:string用于字符串表示,并具有特定于字符串操作的方法,例如substrcompare

此外,您还有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>几乎相同,实际上,您可以在概念上将其视为相同,但是,实践中,有一些重要的区别:

  1. C++11 introduced the requirement that a std::string is required to store a NUL-terminated sequence of characters internally。这使其符合法规要求,并使与C样式字符串的互操作更加容易。显然,std::vector<char>不会与该要求相关联,并且您也不想这样做。

  2. std::string相比,
  3. std::vector<>提供了截然不同的界面。后者只是一个无聊的旧元素序列,而前者实际上是设计用来表示字符串的,因此提供了各种与字符串相关的便捷功能。 (有些人会争论too many,如果它们是作为独立的“免费”函数而不是特殊的“字符串”类的成员函数实现的,则更愿意这样做。)

  4. std::string的通用实现将使用称为"small string optimization (SSO)"的优化,当您存储直接适合std::string对象实例的字符串时,该优化避免了动态内存分配。您不会在std::vector<>中找到这种优化(尽管it could actually be implemented in a custom vector type)。

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

  5. 尽管现在也许只是出于历史原因(特别是因为几乎没有标准库的实现在实践中以这种方式工作),但是在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,则可以使用此方法。