函数中的C erase()

C++ erase() in a function

本文关键字:erase 函数      更新时间:2023-10-16

预计当'helper'函数中的设置元素输出时,元素'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中的 itmainmyset的迭代器。但是helper中的mysetmainmyset copy 。这意味着helper函数中的it并未指您在该功能中使用的myset中的元素,因此它是未定义的行为。您需要在helper中将myset作为参考。尝试:

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

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

您是通过值将set传递给辅助功能。因此,您的迭代器是指原始集合,而不是功能中的副本。

偶数如果迭代器仍然对副本有效,则更改副本不是您想要的。您想更改原件。

通过参考助手将设置传递,以使其完成您想要的。