c++ - 当通知迭代器参数初始化为空列表的开头时,list::insert 的行为是什么?

标签 c++ list stl

假设您有一个 C++ 空列表:

list<int> l;

然后从头开始插入三个新元素:

auto it = l.begin();
    l.insert(it,10);
    l.insert(it,20);
    l.insert(it,30);

当尝试从头到尾打印列表元素时:

for(int i: l){
        cout << i << ' ';
}

得到的结果是:10 20 30

但是假设insert函数在迭代器指向的元素之前插入元素,所以得到的结果应该是:30 20 10.

为什么会发生这种情况?

最佳答案

当列表为空时,begin() 迭代器与 end() 迭代器进行比较。使用 end() 迭代器调用 insert() 会将值插入到列表末尾。 insert() 不会使任何迭代器失效,因此您的 it 变量在每次调用 时仍保留 end() 迭代器插入()

如果您希望值的顺序与调用 insert() 的顺序相反,请使用 insert() 返回给您的迭代器,例如:

auto it = l.begin();
it = l.insert(it,10);
it = l.insert(it,20);
it = l.insert(it,30);

Live Demo

关于c++ - 当通知迭代器参数初始化为空列表的开头时,list::insert 的行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61925270/

相关文章:

c++ - 使用位数组?

c# - 在一行中将字符串转换为 List<string>?

c++ - 在析构函数中处理 STL 容器的取消分配

c++ - Scanf 没有按预期工作

c++ - 处理和触发从 QML 到 C++ 的事件,反之亦然

c++ - 本地类友元函数的名称查找

list - 使用 lisp 将变量附加到列表列表

python - 比较具有不同索引量的两个嵌套列表

c++ - 为什么 std::forward 有两个签名?

c++ - 过滤 STL 容器的现代方法?