就我个人而言,我更喜欢使用 std::vector
,因为不能保证 std::string
存储在连续的内存空间中,而且 std::string::data()
不一定是 O(1) 的。在 C++0x 中,std::vector
将有 data
成员函数。
std::vector::data()
,你也可以通过 &v[0]
(确保它不为空)获得相同的结果。 - Mike Seymourstd::string
的 c_str()
方法来强制其存储连续的内存。虽然有些粗糙,但是很有效。这样做可以在需要时强制使用连续的内存。 - Mike DeSimonedata()
比c_str()
更适合这里,因为它不会附加终止0。后者甚至可能比前者更慢。 - avakarc_str()
强制字符串给你一个连续的表示,但这并不强制它“存储连续”。关键在于data()
和c_str()
不会使迭代器或引用失效,因此实现不能“丢弃”之前使用的任何非连续存储。修改从c_str()
或data()
返回的数组是未定义行为,而对于向量,您可以修改从&v[0]
获取的数组,并且它会修改向量。这是一堆老古董,没有人实现非连续的字符串,这就是为什么C++0x正在改变它的原因;-) - Steve Jessopdata()
和c_str()
可能会使引用失效。但这仍然不意味着它们需要转换字符串的“真实”存储方式。它们都返回const char*
,所以与向量不同,标准并不要求字符串提供任何提供连续可修改数据的方法。这就是你需要使用C风格读取API的情况。 - Steve Jessop&arr[0]
的行为才被定义。 - avakar我认为使用std::vector
是更好的选择,因为它被设计用作数组。虽然所有实现(我知道和听说的)都将字符串“元素”存储在连续的内存中,但这并不意味着它是标准的。也就是说,像字节数组一样使用std::string
的代码假定元素是连续的,而根据标准,它们不必是连续的。
std::vector
并不要求连续存储,但是2003年的标准确实要求它(§23.2.4/1)。C++ 0x将为std::string
添加类似的要求(N3000中的§[string.require]/5)。 - Jerry Coffin
find()
,而std::vector
则没有。 (对于std::vector
,你需要引入<algorithms>
或类似的库。) - Mike DeSimone