重置向量的向量的unordered_map

时间:2013-05-26 19:47:59

标签: c++ map vector

我正在尝试构建一个类来处理关键的回调。

为此,我将地图定义为:

class Keyboard {
public:
   void registerCallback(int key, callback_fn func, bool repeat = false);
   void onKeyEvent(int key, int state);

private:
    typedef std::function<void (int)> callback_fn;

    struct Callback {
        Callback(callback_fn f, bool r)
            : func(f), repeat(r), last_state(-1) {}

        callback_fn func;
        bool repeat;
        int last_state;
    };

    std::unordered_map<int, std::vector<Callback>> callbacks;
};
然后我按照这样注册回调:

void Keyboard::registerCallback(int key, callback_fn func, bool repeat) {
    // My understanding is that if there is nothing mapped to the key
    // it will create a new vector. Otherwise it will return the mapped
    // object. I did try checking if anything already exists at the key
    // and if not creating a new vector but it yielded the same results.
    callbacks[key].push_back({ func, repeat });
}

但是我遇到的问题是,映射的矢量似乎丢失了所有元素。

当我注册一个回调时,给定键的向量增加了,但当我尝试在另一个方法中迭代向量时,它没有元素。

下面是我迭代向量的方法。

void Keyboard::onKeyEvent(int key, int state) {
    for(auto& callback : callbacks[key]) {
        if(callback.repeat || callback.last_state != state) {
            callback.func(state); 
        }
    }
}

请注意,如果我将std::cout << callbacks[key].size() << std::endl;添加到它打印的函数顶部0

如果重要的是我如何注册回调。

keyboard.registerCallback('w', [](int state) {
    std::cout << "w " << (state == GLFW_PRESS ? "pressed" : "released") << std::endl;
}, true);

我怀疑我的问题源于我更习惯的Java地图与C ++地图

之间的差异

2 个答案:

答案 0 :(得分:3)

让我猜一下:问题是您收到的密钥代码是大写字母('W';字母键代码通常是大写的),但是注册一个小写字母的回调({{1} })。

答案 1 :(得分:0)

问题很可能是区分大小写的问题,因为您的代码没有什么特别之处,并且调试器中的10秒确认没有任何神奇的事情发生。只要您使用相同的“键盘”实例,那么它找不到您正在寻找的“键”的唯一原因是因为它与您注册的键不同。

您是否在调试器中单步执行并确定要搜索的密钥?你尝试输出了吗?

如果你必须处理变量大小写,那么你总是可以重载'unordered_map'来使用自定义散列函数,它可以为你做一个无谓的比较。