【发布时间】:2017-03-26 02:29:49
【问题描述】:
在 c++ 入门 5th, 9.2.5 中。分配和交换,我读到了这个:
元素没有被移动的事实意味着,除了 字符串、迭代器、引用和指向容器的指针是 未作废。它们引用与以前相同的元素 交换。
那么,为什么字符串是一个例外呢?我一直认为那个字符串是一个向量,不是吗?
【问题讨论】:
在 c++ 入门 5th, 9.2.5 中。分配和交换,我读到了这个:
元素没有被移动的事实意味着,除了 字符串、迭代器、引用和指向容器的指针是 未作废。它们引用与以前相同的元素 交换。
那么,为什么字符串是一个例外呢?我一直认为那个字符串是一个向量,不是吗?
【问题讨论】:
您引用的措辞表明字符串不是向量。当您交换两个向量时,迭代器保持有效并指向新向量。对字符串没有类似的要求。这允许字符串使用小缓冲区优化。
比较basic_string 和vector 可能更合适,因为它们都是根据元素类型和分配器参数化的模板。这显示了进一步的差异:basic_string 可能只针对文字类型。而basic_string 还接受第三个参数,即特征,它决定了如何进行比较。
字符串与向量的共同点是它们连续存储数据。
【讨论】:
std::string不是std::vector。这是std::basic_string。
【讨论】:
std::string 在标题<string> 中定义为这样的模板:
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
但是vector 的定义不同:
template<
class T,
class Allocator = std::allocator<T>
> class vector;
所以std::string 和vector<char> 是不一样的。
它们的实现方式不同。
【讨论】: