我尝试了代码打击,inserterback_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/

10-09 15:10