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

问题描述:

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()时迭代器无法引用它们所属的容器。为什么迭代器在容器调用分配时无法引用它们所属的容器?

+0

什么问题?什么书? – Barry

+0

不,这绝对不正确。 – Barry

+0

为什么?我在Codeblocks中运行上面的代码没有错误。 –

这对顺序容器是非法的,如vectordeque

[sequence.reqmts/4表100

a.assign(i,j)前:ij没有迭代器a

,但我相信这是对明确提出std::string有效:

[字符串::分配]/20

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

影响:等价于assign(basic_string(first, last))

该标准要求实施在执行分配之前制作序列的副本(或者至少,其行为如同它的行为一样)。没有要求我可以看到迭代器不指向被分配的字符串。

我不确定为什么它不能以这种方式为容器工作,但是如果我不得不猜测,我会说这正是为了避免强制执行额外的副本。

+0

嗯,有趣。我查看了http://www.cplusplus.com/reference/string/string/assign/,它声称迭代器正在失效。显然标准优先... –

+2

@ H.Guijt这是'assign()'的后置条件,而不是其参数的先决条件。 – Barry