C++ 在函数中使用迭代器擦除映射元素
我需要在一个函数中使用迭代器擦除映射元素,该函数将映射迭代器作为参数,但得到运行时错误(free():double free detected)。这是我的代码:C++ 在函数中使用迭代器擦除映射元素,c++,c++11,C++,C++11,我需要在一个函数中使用迭代器擦除映射元素,该函数将映射迭代器作为参数,但得到运行时错误(free():double free detected)。这是我的代码: #include <iostream> #include <map> std::map<int32_t, int32_t> mapp; void erasee(std::map<int32_t, int32_t>::iterator itr) { itr = mapp.eras
#include <iostream>
#include <map>
std::map<int32_t, int32_t> mapp;
void erasee(std::map<int32_t, int32_t>::iterator itr) {
itr = mapp.erase(itr);
}
int main()
{
mapp.emplace(1, 1000);
std::map<int32_t, int32_t>::iterator itr = mapp.begin();
while(itr != mapp.end()) {
std::cout << "before" << std::endl;
erasee(itr);
std::cout << "after" << std::endl;
}
return 0;
}
#包括
#包括
地图地图;
无效擦除(标准::映射::迭代器itr){
itr=映射擦除(itr);
}
int main()
{
地图位置(11000);
std::map::迭代器itr=mapp.begin();
while(itr!=mapp.end()){
std::coutitr
通过值传递给erasee
。因此,在erasee
返回后重新分配它没有效果
作为快速解决方案,您可以通过引用传递它:
void erasee(std::map<int32_t, int32_t>::iterator & itr) {
void擦除(std::map::iterator&itr){
尽管返回一个新的迭代器可能是一个更具可读性的解决方案。您将迭代器移动到下一个元素的位置?在while循环的末尾添加itr++
。@Tony insideerase
函数,因为std::map::erase
将迭代器返回到下一个元素。我认为迭代器是通过引用传递到era的查看
函数,对吗?不正确。在函数声明中向itr添加&
,或者在while循环的末尾添加itr++
。@Tony是不是我必须传递一个类似int**
的双指针才能修改指针变量int*
?不。我知道的唯一例外是一个衰减的原始数组指向指针。在您的情况下,迭代器是通过值发送的,而不是通过引用发送的。这就是为什么需要&
,或者在main中增加它…[[nodiscard]]自动擦除(std::map::iterator itr){return mapp.erase(it);}