c++ - 当擦除和 push_back 发生时如何正确擦除 reverse_iterator?
问题描述
我有一个列表容器,它看起来像:
std::list<int> l = {1,2,3,4,5,6,7,8};
我经常擦除元素,所以我选择std::list
.
但是,我也想在 O(1) 中找到元素,所以我记录了 reverse_iterator。
例如:
l.push_back(9);
auto s = l.rbegin(); // record the iterator of 9, in order to erase it in the future fastly.
cout << *s << endl;
l.push_back(10);
auto s2 = l.rbegin();
但是当我像这样擦除时:
l.erase(std::next(s).base()); // s the iterator of 9, in my brain
我想擦除 9,但实际上,它擦除了 10。
我有两个问题:
为什么我应该使用next
?实际上我*s
可以得到元素,这与.end()
.
我怎样才能在我以前保存的迭代器中进行擦除?
解决方案
由于 的迭代器list
是一个双向迭代器,而不是使用reverse_iterator
,您可以只使用--l.end()
来获取最后一个值的迭代器。
std::list<int> l = {1,2,3,4,5,6,7,8};
l.push_back(9);
auto s = --l.end(); // record the iterator of 9
l.push_back(10);
l.erase(s); // erase the iterator of 9
推荐阅读
- angular - RxJS HTTP-Client:非 JSON 的响应类型
- kubernetes - 配置 minikuke kube-system cpu 限制
- python - SQLAlchemy 与来自同一父列的 2 个 ForeinKeys 的子关系
- spring - Spring Data REST中具有多对多关系的POST请求
- python - 什么是有效的 appJar 拉伸函数参数
- vba - VBA For Excel (CSV),循环文件以获取行,然后将行附加到一个列表中
- c++ - 从创建的类中获取用户输入
- javascript - Express Route 处理程序未针对文件类型路径触发
- javascript - 需要帮助从深层数组中提取对象并组合成一个数组
- php - 包裹在 while 循环中会创建额外的 div