7

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

4

7 回答 7

7

使用 C++11,您可以尝试:

tree[3]=vector<int>({2,1,0});

除此之外,这个问题可以使用更多细节和一些你已经尝试过的代码......

于 2013-03-04T00:08:43.367 回答
5

由于您要求 C++03 的答案,这个(比 C++11 更详细)解决方案将起作用。

tree[3].push_back(2);
tree[3].push_back(1);
tree[3].push_back(0);
于 2013-03-04T00:35:04.440 回答
2

请注意,以下两行没有达到您的预期:

tree[1] = vector<int>(0);
tree[2] = vector<int>(1, 0);

对应向量的构造函数的第一个参数是容器的初始大小。第二个参数是初始化容器元素的值。因此,第一行构造了一个空向量,第二行构造了一个向量,其中一个元素初始化为 0。

如其他答案所示,push_back()如果您不能使用C++11 features ,这是一个不错的选择。但是,一旦升级到 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 1 0
4 => 3 2 1 0
5 => 0

Ideone 上的代码

于 2019-09-19T09:15:02.440 回答
1

你考虑过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));
}
于 2013-03-04T01:50:30.150 回答
0

我不是特别喜欢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
}
于 2013-03-04T01:17:36.333 回答
0

正如 Daniel Frey 指出的那样,您可以使用

tree[3] = vector<int>({2,1,0})

在类似 python 的伪代码中,这里使用的向量构造函数是

def vector(arr)

原始帖子建议您尝试使用表单的构造函数

def vector(*args)

这不存在。

如果您不使用 C++11,请考虑使用vector's other constructors之一。

于 2013-03-04T00:26:11.927 回答
0

如果没有 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);
于 2013-03-04T00:35:23.380 回答