函数中的C erase()
C++ erase() in a function
预计当'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
中的 it
是main
中myset
的迭代器。但是helper
中的myset
是main
中 myset
的 copy 。这意味着helper
函数中的it
并未指您在该功能中使用的myset
中的元素,因此它是未定义的行为。您需要在helper
中将myset
作为参考。尝试:
void helper(set<int> & myset, set<int>::iterator it)
编辑:这也解决了您可能没有注意到的另一个问题。以前,在按值进行myset
时,您只是在修改本地副本。您将(尝试)从复制品中删除元素,然后打印它,但这不会影响传递给main
功能的原始myset
。通过将其引用,helper
功能中myset
的更改实际上将更改原始myset
。
您是通过值将set
传递给辅助功能。因此,您的迭代器是指原始集合,而不是功能中的副本。
偶数如果迭代器仍然对副本有效,则更改副本不是您想要的。您想更改原件。
通过参考助手将设置传递,以使其完成您想要的。
相关文章:
- C++ 结构错误"调用'erase'没有匹配函数
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 如何使用 erase() 函数通过索引擦除矢量?
- 字符串 erase() 函数为类似的调用给出不同的结果
- 没有 std::string .erase() 的重载函数实例
- 调用 vector.erase() 函数时指针操作无效错误
- 函数中的C erase()
- 我的erase()函数中的bug用于链接列表
- 使用std::vector中的函数erase
- 为什么std::whatever::erase()是一个方法,std::remove()是独立函数
- 模板化"find-and-erase"函数中的错误
- 在字符串中使用 erase 函数是否会使迭代器失效
- 调用 std::vector:<int>:erase(int&) 时没有匹配函数
- std::deque::erase函数的时间复杂度是多少
- Multimap -想知道.erase()函数
- 成员函数erase()在循环中不起作用
- 错误C2280:试图引用已删除的函数(试图调用vector.erase)
- 为什么在调用erase和push_back函数后,下列元素同时出现在这个c++ vector的头和尾?
- 为什么Vector中的Erase和Insert函数使迭代器失效?
- 没有与参数列表匹配的重载函数".erase"实例