25

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

#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}ましたが、失敗しました。どの構文を使用すればよいですか?

事前にベクトルを宣言して名前を付ければすべて機能しますが、多くのベクトルを含むマップが必要なので、そうしたくありません。

前もって感謝します

4

6 に答える 6

28

空のベクターが必要な場合は、次のようにします。

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

次に、次のような要素を追加できます。

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

編集: マップが拡大した場合にベクトルがコピーされるという誤ったアサーションを削除しました。コメンターが指摘したように、これはノードベースの std::map には当てはまりません。

于 2012-05-07T19:32:54.907 に答える
12

基本的に、あなたの質問は への挿入に関するものではありませstd::vectorstd::map。あなたの質問は、任意の初期要素値を持つ匿名 をどのように簡単に作成できるかです。std::vector

ISO C++03 ではできません。 ただし、C++11 では 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;
}

挿入するベクトルのサイズが異なる場合は、可変長関数を使用できますが、その場合、要素の数を渡すか、予約済みのセンチネル値を持つ必要があります。

于 2012-05-07T19:31:45.767 に答える
8

C++11 を使用している場合は、次のようなベクトルの初期化リストコンストラクター(そのリストの最後のコンストラクター) を使用できます。

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

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

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

この方法では、ベクターをコピーする必要はありません。追加のベクトルのデフォルト構成が得られますが、それはそれほど高価ではありません。

于 2012-05-07T19:34:46.090 に答える
4

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

{1,2}それがうまくいかなかったのに私は驚いています。C++11 コンパイラを使用していませんか? そうでない場合は、デフォルトのコンストラクター (値なし) を使用してベクターを作成するか、最初に値を入力して貼り付けることができます。

于 2012-05-07T19:27:31.653 に答える
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;
}
于 2012-05-07T19:44:18.503 に答える
1

C++03 にはイニシャライザ リストがないため、コレクションを初期化するのが面倒な場合があります。

より新しいバージョンのコンパイラにアップグレードできない場合は、いつでもBoost.Assignmentライブラリを使用できます。list_ofまさにこのための機能を備えています。

#put something here# -> boost::assign::list_of(1)(2)
于 2012-05-07T19:52:26.870 に答える