如何在C++中填充 int 和矢量的地图<int>?
How can I fill a map of int and vector<int> in C++?
我一直在使用<map>
,在那里我声明了一个映射如下:
map <int, vector<int> > tree;
我现在正试图给它赋值。我的目标是将多个值作为其键的元素。像这样:
0=null
1=>0
2=>1,0
3=>2,1,0
4=>3,2,1,0
5=>0
我试着像这样分配给地图,但它不工作:
tree[3]=vector<int>(2,1,0);
然而,以下两种分配工作的方式:
tree[1]=vector<int>(0);
tree[2]=vector<int>(1,0);
问题在哪里?如何创建一个像Python字典一样的函数?
对于c++ 11,您可以尝试:
tree[3]=vector<int>({2,1,0});
除此之外,这个问题可以使用更多的细节和一些你已经尝试过的代码…
既然你要求的是c++ 03的答案,那么这个(比c++ 11更冗长)解决方案就可以了。
tree[3].push_back(2);
tree[3].push_back(1);
tree[3].push_back(0);
请注意,以下两行并没有按照您的期望执行:
tree[1] = vector<int>(0);
tree[2] = vector<int>(1, 0);
对应vector的构造函数的第一个形参是容器的初始大小。第二个形参是用来初始化容器元素的值。因此,第一行构造一个空向量,第二行构造一个元素初始化为0的向量。
如其他答案所示,如果不能使用c++ 11特性,push_back()
是一个不错的选择。但是,一旦升级到c++ 11,您还可以使用嵌套列表初始化来初始化映射,如下所示:
int main() {
std::map<int, std::vector<int>> tree{
{1, {0}}, {2, {1, 0}}, {3, {2, 1, 0}}, {4, { 3, 2, 1, 0 }}, {5, { 0 }}
};
for (auto const &kv : tree) {
std::cout << kv.first << " =>";
for (auto const &i : kv.second)
std::cout << " " << i;
std::cout << std::endl;
}
return 0;
}
输出:1 => 0
2 => 1 0
3 => 2 0 0
4 => 3 2 1 0
5 => 0
Ideone上的代码
如果没有c++ 11,代码将不会那么优雅:
tree[0]; // create empty vector for index 0
tree[1].push_back(0);
tree[2].push_back(1);
tree[2].push_back(0);
tree[3].push_back(2);
tree[3].push_back(1);
tree[3].push_back(0);
tree[4].push_back(3);
tree[4].push_back(2);
tree[4].push_back(1);
tree[4].push_back(0);
tree[5].push_back(0);
您考虑过std::multi_map
吗?
#include <map>
int main()
{
std::multimap<int, int> map;
for (int i=1; i < 6; i++)
for (int j=1; j < i; j++)
map.insert(std::make_pair(i, j));
}
正如Daniel Frey指出的,您可以使用
tree[3] = vector<int>({2,1,0})
在类python伪代码中,这里使用的向量构造函数是
def vector(arr)
原来的帖子建议你试图使用形式的构造函数
def vector(*args)
不存在
如果您不使用c++ 11,请考虑使用vector
的其他构造函数之一
我不是特别喜欢 va_args,但只要你(用户)不把它弄乱,即混合类型,解决方案在某种程度上比大多数解决方案"更整洁"。另一个缺点是你的向量不能包含-1,但你的例子没有显示它。
#include <vector>
#include <cstdarg>
#include <iostream>
//Unsafe but it works.
template<typename T>
std::vector<T> make_vector(T num, ...) {
std::vector<T> result;
va_list args;
va_start(args,num);
for(T i = num; i != -1; i = va_arg(args,T))
result.push_back(i);
va_end(args);
return result;
}
int main() {
std::vector<int> v = make_vector(0,1,2,3,-1); //-1 to stop
//do stuff with vector v
}
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 为什么不;名字在地图上是按顺序排列的吗
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 如何为地图< map<int,int> 、bool > 分配值?
- 为什么我必须将地图值的类型从 & 更改为 (int*)&
- 使用变换翻转地图,接收错误"type int unexpected"
- 多地图<矢量<int>>,字符>如何排序?
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 以C++显示字符串矢量<int>地图
- C++ 如何打印此地图 std::map<int, pair<vector<pair<int, int>>, int>>
- 使用在地图上查找<对,int>
- 标准::地图按值大小排序(设置<int>)
- 如何在将多维 int 数组映射到 C++ 中的字符串时实现在地图上查找或计数
- 删除地图中的指针<int,A*>
- 通过引用传递地图<int,矢量>
- 如何添加到地图 <int、列表<int>>
- 访问矢量中的地图:map<string,vector<map<string,矢量<int>> > >
- 如何在C++中填充 int 和矢量的地图<int>?