2012-05-07 10 views
11

マップの値のベクトルを挿入する方法を理解しようとしています。例:マップの値のベクトルをC++で挿入する

#include <iostream> 
#include <vector> 
#include <map> 

using namespace std; 

int main() 

{ 

    map <int, vector<int> > mymap; 

    mymap.insert(pair<int, vector<int> > (10, #put something here#)); 

    return 0; 
} 

使用する構文がわからない値のベクトルを挿入します。私は{1,2}を試しましたが、失敗しました。私はどのような構文を使うべきですか?

ベクターをあらかじめ宣言して名前を付けるとすべて動作しますが、たくさんのベクトルを持つマップを作成したいので、これをしたくありません。

は、私はその{1,2}が動作しませんでしたが驚いて、事前に

+0

コンテンツの内容をどのように知っていますか? – mkb

答えて

7

基本的に質問はstd::vectorstd::mapに挿入することではありません。あなたの質問は、匿名std::vectorを任意の初期要素値で簡単に作成する方法です。

ISO C++ 03では、できません。しかしながら、C++11 allows using initialization lists for this

あなたがC++ 03コンパイラで立ち往生している場合、あなたはおそらく指定された要素を持つベクトルを返すためにヘルパー関数を作成することができます。あなたが挿入しているベクトルのサイズが異なる場合

std::vector<int> make_vector(int a, int b) 
{ 
    std::vector<int> v; 
    v.push_back(a); 
    v.push_back(b); 
    return v; 
} 

、バリデーショナル関数を使用することもできますが、そうするには要素の数を渡すか、予約されたセンチネル値を持つ必要があります。

+0

匿名のベクトルを作ることができます。あなたがそれを作った後、建設の後でそれを追加した後、ちょうど参照によってそれを得る。実際、C++ 03ではヘルパー関数が最良の方法です。 –

2

#put something here# = vector<int>{1,2}

をありがとうございました。 C++ 11コンパイラを使用していませんか?そうでない場合は、デフォルトのコンストラクタ(値なし)を使用してベクターを作成するか、値を最初に入力して貼り付けてください。

+0

'vector'には同じ初期値のn個のコピーを持つ新しいベクトルを作成するコンストラクタもあります。 – mkb

+0

私のコンパイラはCode :: Blocks 10.05であり、あなたの提案は私にとってはうまくいかない。私はそれが私のコンパイラではできないと推測しています。 – Akavall

+0

@Akavall、あなたのIDEです。ダウンロードリンクで古いバージョンのGCCを使用するので、コンパイラとライブラリを手動でアップグレードする必要があります。 – chris

12

あなたが行うことができ、空のベクターたい場合:

mymap[10].push_back(1); 
mymap[10].push_back(2); 

編集

mymap.insert(pair<int,vector<int> >(10, vector<int>())); 

をあなたは、その後のようなもので、あなたが好きな要素を追加することができます削除。間違った主張ベクトルこと地図が大きくなると/がコピーされます。コメント者が指摘したように、これはノードベースのstd :: mapでは当てはまりません。

+0

'map'は値yesで保存しますが、マップを大きくすることは決してキーと値のペアをコピーしません。期間。これまでそれでベクトルを入れてください。 'list'、' set'、 'multimap'、' multiset'と同じです。このプロパティのため、ノードベースのコンテナと呼ばれています。 –

+0

あなたの答えは間違っています。 'map'を成長させることは**そのコンテンツを動かすことを意味しません**。これまで'map 'の不幸な(1)要件の1つは、いったん設定されると、要素が消去されるまで移動しないということです。 (1)第1の原則(コンテナの役割)から考えるよりもむしろ既知の実装から導かれ、Bツリーなどの赤黒の木よりも効率的な実装を妨げるので、残念です。 –

5

あなたがC++ 11は、あなたがこのようになり、ベクトルの初期化リストconstructor(そのリストの最後のコンストラクタ)を使用することができます使用している場合:

mymap.insert(pair<int, vector<int> > (10, {1, 2, 3})); 

あなたが唯一のC++ 03を使用することができた場合は、 vectorには、十分な可能性のある各要素のサイズとデフォルト値を取るコンストラクタがあります。それ以外の場合は、ベクターを構築してから挿入する必要があります。あなたは可能性swapそれがでそうのように挿入したときに、ベクターのunnessicaryコピーを避けたい場合は、次のベクトルは必要ありません

vector<int> myvec; 
myvec.push_back(1); 
myvec.push_back(2); 
mymap[10].swap(myvec); 

このようにコピーされます。あなたは余分なベクトルのデフォルトの構築を得るが、それほど高価ではない。

1

これはC++ 2003コンパイラで動作するはずです。

#include <iostream> 
#include <vector> 
#include <map> 
#include <cassert> 

using namespace std; 

std::vector<int> make_vector(int a, int b) { 
    std::vector<int> result; 
    result.push_back(a); 
    result.push_back(b); 
    return result; 
} 

int main() 

{ 

    map <int, vector<int> > mymap; 

    mymap.insert(make_pair(10, make_vector(1,2))); 
    // Or, alternatively: 
    // mymap[10] = make_vector(1,2); 

    assert(mymap[10][0] == 1); 
    assert(mymap[10][1] == 2); 

    return 0; 
} 
1

C++ 03には、初期化リストがないため、コレクションを初期化できません。

コンパイラの最新バージョンにアップグレードできない場合は、いつでもBoost.Assignmentライブラリを使用できます。これには正確にlist_ofの機能があります。

#put something here# -> boost::assign::list_of(1)(2) 
関連する問題