c ++我可以在我的代码中将这样的向量新添加到哈希图中吗

c++ can I new a vector like this in my code into a hashmap

// father is an array of integers, irrelevant to the actual question

 vector<pair<int,int>> edges = {
          {0, 2},
          {2, 3},
          {1, 4},
          {1, 5}
        };

unordered_map<int, vector<pair<int,int>> edges_map_by_component;
    for(auto edge: edges){
      if(edges_map.find(father[edge.first]) == edges_map_by_component_map.end()){
        //  ---> my question is, is the following line valid?
        edges_map_by_component.emplace(father[edge.first] , new vector<pair<int,int>>()); 
        edges_map[father[edge.first]].push_back(make_pair (edge.first,edge.second));

  }
}

在 C++ 中,

  1. 我可以像这样使用 new 添加一个 vector 对象到 hashmap 吗?
  2. 那条线有效吗?
  3. 如果是,是否需要为vector指定大小,如果我实例化它 在地图里面?

编辑: 你说过我不应该在这里使用 new,但似乎简单地删除 new 也不起作用。我应该在这里做什么。基本上我的逻辑是,如果 hashmap 不包含特定的键,我会为它创建一个 vectorpair<int, int>,将它与那个键相关联,并且 push_back() 一些对进入 vector.

通常是的。不,不像你那样,因为你使用了错误的类型。您在此处插入的是指向您尚未在模板参数中声明的向量的指针。您需要将模板参数更改为 unsorted_map<int, vector<pair<int,int> >* > 或删除 new。这取决于你以后想如何使用这个结构。

您的代码有错别字或错误:

unordered_map<int, vector<pair<int,int>> edges_map_by_component;
//                                    ^^

应该是(假设您使用的是 C++11,您不需要在随后的闭合模板大括号之间放置空格):

unordered_map<int, vector<pair<int,int>>> edges_map_by_component;
//                                    ^^^

除此之外,实际上,删除 new,因为您的地图的第二个参数是 vector<pair<int, int>>,而不是指向它的指针。这样就可以正常工作了:

#include <iostream>
#include <vector>
#include <unordered_map>

int main(void)
{
    std::unordered_map<int, std::vector<std::pair<int,int> > > mymap;
    mymap.emplace(5, std::vector<std::pair<int,int> >());
    mymap[5].push_back({5, 7});
    const std::pair<int, int> p = mymap[5].back();
    std::cout << p.first << p.second;
}

为清楚起见,明确显示了类型。一种更短的写法是:

mymap.emplace(5, decltype(mymap)::mapped_type());

需要注意的是,emplace操作使用了移动语义,所以没有额外的复制进行,你可以预先构造一个vector,填充它的值,然后传递给emplace().