7

I have been working with <map>, where I declared a map as follows:

map <int, vector<int> > tree;

I am now trying to assign values to it. My goal is to place multiple values as elements of its keys. Something like this:

0=null
1=>0
2=>1,0
3=>2,1,0
4=>3,2,1,0
5=>0

I tried to assign to the map like this, but it does not work:

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

However, the following two ways of assigning work:

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

Where is the problem? How can I make a function that works as a Python dictionary?

I am not using 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 に答える
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

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 に答える
0

私はva_args が特に好きではありませんが、あなた (ユーザー) がそれを台無しにしない限り、つまりタイプを混ぜない限り、解決策はほとんどの場合よりもある程度「きちんと」しています。もう1つの欠点は、ベクトルに-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他のコンストラクターのいずれかを使用することを検討してください。

于 2013-03-04T00:26:11.927 に答える