如何从 c++ std::list 中取消链接元素而不释放它?

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)

但我认为这并不安全?

问题:

  1. 是否保证被删除的元素list::erase仍然可以被原始迭代器访问?

  2. 如果是,我怎样才能释放它的内存?

  3. 如果不是,如何删除某些元素而不释放其内存并在删除后能够访问它?

joh*_*ohn 6

如果您不介意使用第二个列表来接收已删除的项目,则可以完成此操作

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。这是一个恒定时间操作,不会使任何迭代器失效。