无法遍历std :: map

时间:2018-04-25 02:25:16

标签: c++ stdmap

自从我开始使用std::map后,每当我点击按钮时,我就开始收到断言错误。我想清除my_map中的所有内容,并在每次单击按钮时再次开始添加。

my.cpp

typedef std::map<str, MyClass> mapper;
mapper my_map;

void add_map(const str& name, MyClass* l) { /...../ }

void invoke_me()
{

这里我初始化了i大小为my_map的变量,但是,它在清除之前返回之前的大小

    int i = my_map.size(); // i = 4, my_map.size() = 1

    if (!my_map.empty())
    {
        for (const auto& it : map)
        {
            // Assert error: map/set iterator not incrementable
            const MyClass& l = it.second;
            l.on_clicked();
        }
    }
}
// cont'd

这应该是my_map的整洁,但我认为它没有做好正确的工作

void clear_map()
{
    my_map.clear();
}

implementor.h

struct MyClass
{
    std::function<void()> on_clicked;
};

implementor.cpp

MyClass button;

button.on_clicked = [&] {
    clear_map();
    add_map("MyButton", &button);
};

实际上on_click是一个回调,它必须通过invoke_me函数调用

的main.cpp

while (RUNNING)
    invoke_me();

我会说,这是因为地图尺寸不正确导致即使它超出范围也会保持循环,或者我可能已经损坏或弄乱了该地图。<\ n \ n

/ p>

1 个答案:

答案 0 :(得分:2)

可能会有更多问题,但这看起来是主要问题:

button.on_clicked = [&] {
    clear_map();
    add_map("MyButton", &button);
};

您正在清除地图,并且在您进行迭代时会调用此函数:

for (const auto& it : my_map)
{
    // Assert error: map/set iterator not incrementable
    const MyClass& l = it.second;
    l.on_clicked();
}

您的迭代器因clear而无效。