2

新しく挿入されたペアからマップにペアを正しく効率的に返すにはどうすればよいですか?

inline pair<unsigned int, T> *createObj(unsigned int UID){
    static pair<unsigned int, T> ret;

    objList.insert(pair<unsigned int, T>(UID, T()));

    if (UID_Counter <= UID) 
        UID_Counter = UID+1; 
    ret = make_pair(UID, objList.find(UID)->second);
    return &ret;
}

上記は使用するオブジェクトを返しますが、retで変更したものは、マップの「実際のペア」では変更されません。

基本的に私が達成したいのは:

  1. 新しいオブジェクトZマップAに挿入します
  2. ("子"クラス)返されたオブジェクトZの内容を変更します
  3. 更新サイクルごとに、マップAのオブジェクトを反復処理し、更新時にオブジェクト「A- Z 」にロードされた実際のデータを使用します。
4

1 に答える 1

4

使用している特定のオーバーロードはinsert、を返しますstd::pair<iterator, bool>。特に、そのペアの最初のメンバーは、新しく挿入された要素またはすでに存在していた要素のいずれかへのイテレーターです。したがって:

pair<const unsigned int, T>&
createObj(unsigned int UID)
{
    auto inserted = objList.insert(pair<unsigned int, T>(UID, T()));

    if (UID_Counter <= UID) 
        UID_Counter = UID+1; 

    return *inserted.first;
}

ポインタを返していた場所で参照を返していることに注意してください。キーの種類はconst unsigned intであり、ではありませんunsigned int。も使用できます(コンテナのタイプはmap_type::value_typeどこにありますか)。map_type

コードが機能しなかった理由がわからない場合は、マップされたオブジェクトのコピーを内部に格納していたretため、返されたポインタを介した変更はそのコピーにのみ影響します。

于 2011-09-04T00:59:52.977 に答える