2

私は C++ コンテナー テンプレートを初めて使用します。私はレコードのコレクションを持っています。各レコードには一意の名前と、フィールドと値のペアのリストがあります。レコードは名前でアクセスされます。フィールドと値のペアの順序は重要です。したがって、次のように設計しました。

typedef string      Typecode;
typedef string      Fieldname;
typedef string      Fieldvalue;
typedef vector<pair<Fieldname, Fieldvalue> >  Field_value_pairs;
typedef map<Typecode, Field_value_pairs>      Record_map;

Record_map          records;

Typecode 型のキーと空の Field_value_pairs ベクトルを持つレコードにエントリを追加するメソッドadd_record(Typecode)を定義したいと考えています。(後で、フィールドと値のペアの一部またはすべてを追加します。) しかし、どの map<> および vector<> メソッドを使用すればよいかわかりません。

のようにoperator=を使用したいと思いますrecords["foo_record"] =。しかし、「ペアの空のベクトル」を作成するには、値として何を割り当てる必要がありますか?

4

2 に答える 2

3

次のように割り当てる必要があります。

records["foo_record"] = vector<pair<Fieldname, FieldValue> >();

std::vector のデフォルトのコンストラクターは空のベクターを作成し、次を使用して新しい値を追加できます

records["foo_record"].push_back(pair<Fieldname, FieldValue>("name", "value"));
于 2013-07-05T19:50:41.017 に答える
1

デフォルトでは、オブジェクトを構築し、Field_value_pairsそれを新しいマップ エントリに割り当てます。

void add_record( Record_map& records, Typecode const& code )
{
    records[code] = Field_value_pairs();
}

これにより、その の既存のエントリが上書きされることに注意してくださいTypecodeTypecodeまだ存在しない場合にのみ条件付きで追加する場合は、 を使用map::findしてエントリが存在するかどうかを判断します。

void add_record( Record_map& records, Typecode const& code )
{
    if( records.find( code ) == records.end() ) {
        records[code] = Field_value_pairs();
    } else {
        // entry exists, do something else
    }
}
于 2013-07-05T19:51:42.360 に答える