vector <char> over string?</char>的好处

时间:2012-07-06 08:47:35

标签: c++ string stl vector

此问题与this question有关,但不完全相同。

使用std::vector<char>代替std::string来保存任意二进制数据,一边与可读性相关的问题有什么好处吗?

即。与字符串相比,是否有任何更容易/更有效/更好地执行向量的任务?

7 个答案:

答案 0 :(得分:16)

除了可读性(不应低估),我可以想到使用std::string而不是std::vector会遇到一些轻微的性能/内存问题:

  • 一些现代std::string实施使用small string optimization。如果您存储的数据大于string的内部缓冲区,则会变为悲观,从而降低复制,移动和swap 1 的效率并增加{ {1}}没有任何好处。

  • 高效sizeof()实现将始终至少分配比当前大小多1个字节来存储终止空值(不这样做需要std::string中的额外逻辑来处理{{1 }})。

我应该强调,这两个问题都很小;它们的性能成本很可能会在背景噪声中丢失。但你确实问过。


1 如果正在使用小字符串优化,那么这些操作需要在operator[]上进行分支,而它们不在良好的str[size()]实现中。

答案 1 :(得分:1)

除了可读性,并确保另一个维护者不会混淆std::string的目的,功能上没有太大的区别。如果效率是唯一的考虑因素,你当然可以考虑char * / malloc。

我能想到的一个潜在问题:

std::string默认存储<char>。如果您以后需要处理其他类型(例如unsigned short),您可能需要:

  • 创建自己的typedef std::basic_string<unsigned short>(让您远离正常std::string处理)
  • 暂时在setter中应用一些reinterpret_cast逻辑。

使用矢量,您只需将容器更改为std::vector<unsigned short>

答案 2 :(得分:0)

我认为,这样做的唯一好处就是可以轻松增加std::vector个字符,但即便如此,也可以使用std::string

你必须记住,即使std::string看起来像一个对象,它也可以像数组一样被访问,所以即使访问字符串的特定部分也可以在不使用std::vector的情况下完成/ p>

答案 3 :(得分:0)

理想情况下,人们可以使用vector<unsigned char>来存储任意二进制数据 - 但我认为你已经知道了这一点 - 正如你提到的旧问题。

除此之外,使用vector肯定会更有效,因为string会添加一个终止的Nul字符。性能也可能会提高,因为两者的分配机制不同 - 向量保证连续的内存!

除此之外,使用字符串也不正确,因为调用者/用户可能会无意中调用某些字符串方法,这可能是一场灾难。

答案 4 :(得分:0)

正如其他答案所提到的,向量可能会稍快一些,因为即使是小尺寸的向量也可以保证连续的内存,并且不会在末尾添加额外的空字节。但是,连接两个字符串要比连接两个向量要简单得多(在代码方面):

使用vector

vector<char> a, b;
// ...
vector<char> c;
c.insert(c.end(), a.begin(), a.end());
c.insert(c.end(), b.begin(), b.end());

使用string

string a, b;
// ...
string c = a + b;

答案 5 :(得分:-1)

是的,vector<char>确实 的功能超过string

string不同,vector<char> 可确保在swap操作期间保留迭代器,引用等。请参阅: May std::vector make use of small buffer optimization?

答案 6 :(得分:-1)

mingw上的

std :: string使用6个指针和相等的24个字节。 std :: vector始终是3个指针= 12个字节。

但是std :: string使用更多工具的事实使我怀疑std :: string是否更有效地分配,附加,插入,删除。

虽然文件缓冲区之类的内容仅需要cstring,但文本编辑器需要最佳的字符串结构。