预期在“帮助器”功能中输出设置的元素时,元素“ 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);
}

最佳答案

it中的helpermysetmain的迭代器。但是myset中的helpermysetmain的副本。这意味着it函数中的helper不会引用该函数中使用的myset中的元素,因此它是未定义的行为。您需要在myset中将helper用作参考。尝试:

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


编辑:这也解决了您可能没有注意到的另一个问题。以前,按值取myset时,您只是在修改本地副本。您可以(尝试)从副本中删除元素,然后打印该元素,但这不会影响传递给myset中的函数的原始main。通过引用,myset函数中对helper的更改实际上将更改原始的myset

关于c++ - 函数中的C++ delete(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47930988/

10-10 21:15