簡體   English   中英

如何在不解除分配的情況下將元素與 c++ std::list 斷開鏈接?

[英]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
}

但我認為這並不安全?

問題:

  1. list::erase的元素仍然可以被原始迭代器訪問是一種保證行為嗎?

  2. 如果是,我該如何釋放它的 memory?

  3. 如果不是,我怎樣才能擦除某些元素而不釋放其 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM