ihd*_*hdv 1 c++ iterator stl contains list
假设我有一个 C++std::list对象,其中包含一些元素和一个指向it其中一个元素的迭代器。如何从列表中删除此元素但仍然能够访问它?换句话说,我希望它从列表中取消链接,但不取消分配。
奇怪的是,使用list::erase似乎确实实现了这一点:
#include <iostream>
#include <cstdio>
#include <list>
using namespace std;
int main() {
std::list<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
auto it = (--a.end());
a.erase(it);
cout << *it << endl; /// outputs '3' anyway, without any error
}
Run Code Online (Sandbox Code Playgroud)
但我认为这并不安全?
问题:
是否保证被删除的元素list::erase仍然可以被原始迭代器访问?
如果是,我怎样才能释放它的内存?
如果不是,如何删除某些元素而不释放其内存并在删除后能够访问它?
如果您不介意使用第二个列表来接收已删除的项目,则可以完成此操作
auto it = (--a.end());
std::list<int> b;
b.splice(b.end(), a, it);
cout << *it << endl; /// outputs '3'
Run Code Online (Sandbox Code Playgroud)
spliceit从 list 中删除元素a并将其添加到 list 的末尾b。这是一个恒定时间操作,不会使任何迭代器失效。