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++ 中,
- 我可以像这样使用
new
添加一个 vector
对象到 hashmap 吗?
- 那条线有效吗?
- 如果是,是否需要为
vector
指定大小,如果我实例化它
在地图里面?
编辑:
你说过我不应该在这里使用 new
,但似乎简单地删除 new
也不起作用。我应该在这里做什么。基本上我的逻辑是,如果 hashmap 不包含特定的键,我会为它创建一个 vector
的 pair<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()
.
// 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++ 中,
- 我可以像这样使用
new
添加一个vector
对象到 hashmap 吗? - 那条线有效吗?
- 如果是,是否需要为
vector
指定大小,如果我实例化它 在地图里面?
编辑:
你说过我不应该在这里使用 new
,但似乎简单地删除 new
也不起作用。我应该在这里做什么。基本上我的逻辑是,如果 hashmap 不包含特定的键,我会为它创建一个 vector
的 pair<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()
.