簡體   English   中英

擦除 std::set 的最終成員

[英]Erase final member of std::set

如何從集合中刪除最后一個成員?

例如:

set<int> setInt;
setInt.insert(1);
setInt.insert(4);
setInt.insert(3);
setInt.insert(2);

如何從setInt刪除4 我試過類似的東西:

 setInt.erase(setInt.rbegin());

但我收到一個錯誤。

在 C++11 中

setInt.erase(std::prev(setInt.end()));

您可以決定如何處理集合為空的情況。

if (!setInt.empty()) {
    std::set<int>::iterator it = setInt.end();
    --it;
    setInt.erase(it);
}

順便說一句,如果您經常這樣做(以任意順序將內容添加到集合中,然后刪除頂部元素),您還可以查看std::priority_queue ,看看這是否適合您的使用。

編輯:您應該使用本傑明更好的答案中所示的std::prev而不是本答案中建議的舊樣式。


我建議為rbegin使用不同的名稱,它具有正確的類型:

setInt.erase(--setInt.end());

假設您檢查過setInt不為空!

順便提一句。 這是有效的,因為您可以在臨時(類型std::set<int>::iterator )上調用變異遞減運算符。 然后這個臨時文件將被傳遞給擦除函數。

性能稍差,但另一種選擇:

setInt.erase(*setInt.rbegin());

如果你想刪除 4 而不是最后一個,你應該使用 find 方法。 根據用例,4 可能不是最后一個。

std::set<int>::iterator it = setInt.find(4);
if(it != setInt.end()) {
  setInt.erase(it);
} 

如果要刪除最后一個元素,請使用:

if (!setInt.empty()) {
  setInt.erase(--setInt.rbegin().base());
  // line above is equal to 
  // setInt.erase(--setInt.end());
}

雖然我不確定 --*.end(); 沒關系我做了一些閱讀。 所以 -- on rbegin().base() 導致與 -- on end() 相同的結果。 兩者都應該有效。

檢查集合是否為空。 如果沒有,則獲取最后一個元素並將其設置為迭代器並減少該迭代器並擦除最后一個元素。

if (!setInt.empty())
 {
    std::set<int>::iterator it = setInt.end();
    --it;
    if(it != setInt.end()) {
    setInt.erase(it);
    } 
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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