C++ std::vector和std::basic_string之间的根本区别是什么?
发布于 2010-12-30 03:26:07
basic_string对象中的类字符对象应连续存储在中
非信仰者的相关语录:
basic.string
类模板basic_string符合顺序容器(23.2.3)、可逆容器(23.2)和支持分配器的容器(表99)的要求,只是basic_string不使用allocator_traits::construct和allocator_- container::destroy构造或销毁其元素,并且basic_string的swap()使迭代器无效。basic_string支持的迭代器是随机访问迭代器(24.2.7)。
发布于 2010-12-30 03:15:43
basic_string为编译器和标准库实现提供了一些向量上的自由:
类字符串{ char长度;联合{ size_t * usedWhenStringIsLong;char usedWhenStringIsShortsizeof(char*);};};
basic_string是可能的。(虽然没有人这样做,因为这会使成员std::basic_string::c_str()和std::basic_string::data()的实现成本太高。)C++11现在禁止这种行为。
basic_string允许编译器/库供应商对数据使用写入时复制(这可以保存在副本上),这对于std::vector是不允许的。在实践中,这曾经更常见,但现在不那么常见了,因为它对多线程有影响。但是,无论哪种方式,您的代码都不能依赖于std::basic_string是否使用COW实现。C++11现在再次禁止此行为。
也有一些附加到basic_string上的助手方法,但大多数都很简单,当然可以很容易地在vector之上实现。
发布于 2010-12-30 03:14:12
关键的区别在于,当std::basic_string不能时,std::vector应该将其数据保存在连续内存中。结果是:
std::vector<char> v( 'a', 3 );
char* x = &v[0]; // valid
std::basic_string<char> s( "aaa" );
char* x2 = &s[0]; // doesn't point to continuous buffer
//For example, the behavior of
std::cout << *(x2+1);
//is undefined.
const char* x3 = s.c_str(); // validOn practice this difference is not so important.
https://stackoverflow.com/questions/4557009
复制相似问题