簡體   English   中英

函數中的C ++ delete()

[英]C++ erase() in a function

預期在“幫助器”功能中輸出設置的元素時,元素“ 2”已被刪除。 但是實際結果仍然是“ 1 2 3 4 5”。
但是,集合的大小為4。
我想知道潛在的問題。

#include <iostream>
#include <set>
using namespace std;

void helper(set<int> myset, set<int>::iterator it) {
    myset.erase(it);

    cout << "size:" << myset.size() << endl;
    for(auto el : myset)
        cout << el << " ";
}


int main(int argc, const char * argv[]) {
    set<int> myset = {1,2,3,4,5};

    auto it = myset.begin();
    it++;
    helper(myset,it);
}

helper中, itmain myset的迭代器。 mysethelper副本 mysetmain 這意味着helper函數中的it不會引用您在該函數中使用的myset中的元素,因此它是未定義的行為。 您將需要使helpermyset成為參考。 嘗試:

void helper(set<int> & myset, set<int>::iterator it)

編輯:這也解決了您可能沒有注意到的另一個問題。 以前,按值獲取myset時,您只是在修改本地副本。 您可以(嘗試)從副本中刪除一個元素,然后打印該元素,但這不會影響傳遞給main的函數的原始myset 通過引用,在helper函數中對myset更改實際上將更改原始的myset

您正在按值將set傳遞給輔助函數。 因此,迭代器引用的是原始集合,而不是函數中創建的副本。

即使迭代器仍然有效副本,改變副本是不是你想要的。 您要更改原件。

通過引用將該集合傳遞給您的助手,以使其按照自己的意願進行操作。

暫無
暫無

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

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