为什么迭代器在容器调用分配时不能引用它们所属的容器?

why the iterators can't refer to the container they belong to when container calls assign?

本文关键字:引用 迭代器 调用 分配 为什么 不能      更新时间:2023-10-16
string s="zhangzhizhong";
s.assign(s.begin()+2, s.end()-2);
string is correct!
vector<int> ivec{0,1,2,3,4,5}; 
ivec.assign(ivec.begin()+1, ivec.end()-1); 
vector is also correct!!!

上面的代码是正确的,但书中写的是,当容器调用assign()时,迭代器不能引用它们所属的容器。

这对于顺序容器(如vectordeque(是非法的。

[sequence.rekmts]/4表100

a.assign(i,j) pre:ij不是a 的迭代器

但我相信它明确地对std::string:有效

[string::assign]/20

template<class InputIterator>
basic_string& assign(InputIterator first, InputIterator last);

效果:等效于assign(basic_string(first, last))

该标准要求实现在执行分配之前复制序列(或者至少表现得像这样(。我看不到迭代器不指向所分配的字符串的要求。

我不知道为什么它对容器不起作用,但如果非要我猜测的话,我会说这正是为了避免强制实现制作额外的副本。