[英]How can I delink an element from a c++ std::list without deallocating it?
假設我有一個 c++ std::list
object 包含幾個元素和一個迭代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
}
但我認為這並不安全?
問題:
被list::erase
的元素仍然可以被原始迭代器訪問是一種保證行為嗎?
如果是,我該如何釋放它的 memory?
如果不是,我怎樣才能擦除某些元素而不釋放其 memory 並在擦除后能夠訪問它?
如果您不介意使用第二個列表來接收已刪除的項目,則可以這樣做
auto it = (--a.end());
std::list<int> b;
b.splice(b.end(), a, it);
cout << *it << endl; /// outputs '3'
splice
從列表a
中刪除it
元素並將其添加到列表b
的末尾。 這是一個恆定時間操作,不會使任何迭代器無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.