我今天碰到这个问题,想我应该把它贴出来供社区参考和/或发表意见。
标准C++容器向量、DEQE、列表和字符串提供了 assign 成员函数。有两个版本;我主要对接受迭代器范围的版本感兴趣。这个 Josuttis book 有点模棱两可。从第237页…
assign
分配范围[BEG,END]的所有元素;这是用[BEG,END]元素的副本替换所有现有元素。
它没有说明如果被分配容器的大小与被分配的范围不同会发生什么。它是否截断?它是否自动扩展?这是未定义的行为吗?
这是我发现的。结果证明我不必担心默默地做错事。标准再一次得到了答案。根据第23.2.6.1节:
void assign(Iter first, Iter last); 影响: erase(begin(), end()); insert(begin(), first, last);
void assign(Iter first, Iter last);
影响:
erase(begin(), end());
insert(begin(), first, last);
所以这真的只是 clear() 其次是 insert 全范围的。
clear()
insert