【问题标题】:Can't iterate through std::map [closed]无法遍历 std::map [关闭]
【发布时间】:2018-04-25 02:25:15
【问题描述】:

自从我开始使用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()
{

这里我用my_map的大小初始化变量i,但是它返回之前的大小,然后才被清除

    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函数调用

ma​​in.cpp

while (RUNNING)
    invoke_me();

我会说这是因为地图大小不正确,这就是为什么即使它超出范围,它也会继续循环,或者我可能已经损坏或弄乱了该地图。

【问题讨论】:

  • 您的意思是for (const auto&amp; it : my_map)?您无需在 for 循环之前检查地图是否为空。真实代码的简短完整示例将大大帮助我们帮助您。有几个常见错误可能会导致您看到的相同症状,但仅凭片段很难判断。
  • 它返回之前被清除之前的大小 这是不可能的。请提供minimal reproducible example
  • 我将my_map 设为全局变量而不是成员类变量,因为我不希望它被重置。
  • 这里使用的指针和实例也存在奇怪的不匹配。如果您的地图存储实例,那么您可能制作了您传递指针的对象的副本。 耸耸肩编辑并没有真正增加任何清晰度。
  • button 在用于on_clicked 之前是否可能超出范围?您通过引用进行捕获,然后在将其添加到地图时对其进行复制。

标签: c++ stdmap


【解决方案1】:

可能还有更多问题,但这似乎是主要问题:

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();
}

您的迭代器正在被清除无效。

【讨论】:

  • 是的,如果这就是代码的实际工作方式,那就可以了。好猜测,希望是对的。 :)。
猜你喜欢
  • 2014-04-12
  • 2015-10-22
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
相关资源
最近更新 更多