【问题标题】:How do I insert a element into a std::unordered_map<int, vector<Object*>>如何将元素插入 std::unordered_map<int, vector<Object*>>
【发布时间】:2012-06-20 07:57:59
【问题描述】:

我正在尝试创建指向我的对象的指针数组的哈希。

哈希键是对象类型的 int,数组是要渲染的对象的列表。

我想做的是:

unordered_map<int, vector<Object*> > drawQueue;
drawQueue.clear(); // new empty draw queue

for ( ... ) {
   drawQueue.at(type).push_back(my_obj);
}
 

所以我对 STL 内容的细微差别不够熟悉,因为我收到一个异常说 out_of_bounds,这就是密钥不存在时会发生的情况。

所以我想我需要先创建密钥,然后添加到向量中:

if (drawQueue.count(type)) {
    // key already exists
    drawQueue.at(type).push_back(my_obj);
} else {
    //key doesn't exist
    drawQueue.insert(type, vector<Object*>); // problem here
    drawQueue.at(type).push_back(my_obj);
}

但现在我真的迷路了,因为我不知道如何在 unordered_map 的插入中创建/初始化/任何空的 vector...

还是我这样做完全错误?

【问题讨论】:

  • 你看过 operator[] 吗?还是 insert() 的实际文档?

标签: c++ stl vector unordered-map


【解决方案1】:

您没有以正确的方式使用insert。这应该有效:

drawQueue.insert(std::make_pair(type, std::vector<Object*>()));

如果使用C++11,前面的语句可以简化为:

drawQueue.emplace(type, std::vector<Object*>());

通过使用这种方法,元素是就地构造的(即不执行复制或移动操作)。

我还包括指向 insertemplace 文档的链接。

【讨论】:

  • 在 C++11 中你可以说drawQueue.emplace(type);
  • @KerrekSB 它不适用于 GCC 4.6(使用 -std=c++0x)。你用的是哪个编译器?
  • @KerrekSB 我尝试使用 GCC 4.7 并且它有效:) 我将更新我的答案以包含这种可能性。
【解决方案2】:

我认为这是一种简单的方法。我的示例将创建一个 unordered_map 字符串作为键和整数向量作为值。

unordered_map<string,vector<int>> keys;
keys["a"] = vector<int>(); // Initialize key with null vector
keys["a"].push_back(1); // push values into vector.
keys["a"].push_back(5);    
for(int i : keys["a"] ){
    cout << i << "\t";
}

【讨论】:

  • 是否有某种方法可以检查向量是否已初始化,因为它不是指针?如果稍后回来并想要 push_back 到键“a”上,您不会想要这样做。检查 .size() 是否有效,或者如果未初始化会引发错误?
猜你喜欢
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2016-09-19
相关资源
最近更新 更多