如何在C++中填充 int 和矢量的地图<int>?

How can I fill a map of int and vector<int> in C++?

本文关键字:int 地图 lt gt C++ 填充      更新时间:2023-10-16

我一直在使用<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
}