Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在函数中使用迭代器擦除映射元素_C++_C++11 - Fatal编程技术网

C++ 在函数中使用迭代器擦除映射元素

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

我需要在一个函数中使用迭代器擦除映射元素,该函数将映射迭代器作为参数,但得到运行时错误(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.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::cout
itr
通过值传递给
erasee
。因此,在
erasee
返回后重新分配它没有效果

作为快速解决方案,您可以通过引用传递它:

void erasee(std::map<int32_t, int32_t>::iterator & itr) {
void擦除(std::map::iterator&itr){

尽管返回一个新的迭代器可能是一个更具可读性的解决方案。

您将迭代器移动到下一个元素的位置?在while循环的末尾添加
itr++
。@Tony inside
erase
函数,因为
std::map::erase
将迭代器返回到下一个元素。我认为迭代器是通过引用传递到
era的查看
函数,对吗?不正确。在函数声明中向itr添加
&
,或者在while循环的末尾添加
itr++
。@Tony是不是我必须传递一个类似
int**
的双指针才能修改指针变量
int*
?不。我知道的唯一例外是一个衰减的原始数组指向指针。在您的情况下,迭代器是通过值发送的,而不是通过引用发送的。这就是为什么需要
&
,或者在main中增加它…
[[nodiscard]]自动擦除(std::map::iterator itr){return mapp.erase(it);}