我尝试了代码打击,inserter
和back_inserter
制作了相同的lst3
,但是我认为inserter
应该产生一个{4,3,2,1}
列表,因为应该将新元素插入lst3.begin()
之前的位置。为什么它们会产生相同的结果?
谢谢!
int main() {
list<int> lst = {1,2,3,4};
list<int> lst3;
// copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.begin()));
copy(lst.cbegin(), lst.cend(), back_inserter(lst3));
for_each(lst.cbegin(), lst.cend(), [] (const int i) {cout<<i<<endl;});
return 0;
}
最佳答案
您正在想象与之等效的东西:
copy(lst.cbegin()+0, lst.cbegin()+1, inserter(lst3, lst3.begin()));
copy(lst.cbegin()+1, lst.cbegin()+2, inserter(lst3, lst3.begin()));
copy(lst.cbegin()+2, lst.cbegin()+3, inserter(lst3, lst3.begin()));
copy(lst.cbegin()+3, lst.cbegin()+4, inserter(lst3, lst3.begin()));
(假装这些
+
操作将在列表迭代器上运行)我明白了您为什么会这么认为,但是没有。
当您将
lst3.begin()
提供给inserter
时,该迭代器不会被存储/缓存并重复使用-我们知道它不可能,因为(考虑一下一般情况;特别是列表不容易出现这种情况)每次插入操作可能会使迭代器无效。取而代之的是,迭代器在每次操作后都会增加。
cppreference explains this:
确实,我们可以从the cppreference
insert_iterator::operator=
page亲自看到这一点。最终结果是您实际上是按照从左到右的线性顺序插入的,例如:
copy(lst.cbegin()+0, lst.cbegin()+1, inserter(lst3, lst3.begin()));
copy(lst.cbegin()+1, lst.cbegin()+2, inserter(lst3, lst3.begin()+1));
copy(lst.cbegin()+2, lst.cbegin()+3, inserter(lst3, lst3.begin()+2));
copy(lst.cbegin()+3, lst.cbegin()+4, inserter(lst3, lst3.begin()+3));
(假装这些
+
操作将在列表迭代器上运行)这种行为实际上更直观。整个源范围已按其原始顺序插入到
lst3.begin()
开头的位置。关于c++ - C++中 `inserter`的机制是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43371847/