1

私は次のデータ型を持っています

typedef     std::map <std::string.std::string> leaf; 
typedef     std::map <std::string,leaf> child;
typedef     std::vector<child> parent;

ここで、インデックス0の親要素と、キー「x」を持つ子要素にアクセスして、その値の操作を実行したい場合

これを行う最初の方法は次のようになります。

    parentobject[0]["x"]["r"]

しかし、その値にアクセスしたいときはいつでも、これらのインデックスを繰り返す必要があるたびに。

これを行う2番目の方法は次のようになります。std::stringvalue = parentobject [0] ["x"] ["r"]次に、valueオブジェクトを使用します。しかし、このアプローチの問題は、この行が文字列のコピーを作成することです。

コピーを作成せずに変数にアクセスするためのより良い方法はありますか?

4

2 に答える 2

2

参照を使用して、コピーを回避できます。

std::string & value = parentobject[x][y][z]; 

または、代わりにこれで大丈夫ですか?

//define a lambda in the scope
auto get =  [] (int x, std::string const & y, std::string const & z) 
      -> std::string &
{
    return parentobject[x][y][z];
}

//then use it as many times as you want in the scope
std::string & value = get(0, "x", "r");

get(1, "y", "s") = "modify";
于 2012-12-15T20:29:25.483 に答える
2

参照を使用します:

const std::string& value = parentobject[0]["x"]["r"];

valueこれで、マップルックアップを再度実行しなくても、(同じブロックスコープ内で)好きな場所を参照できます。

本当に必要なconst場合は削除してください。

C ++の基本機能を学ぶために、これらの本の1つを購入して読んでください。

于 2012-12-15T20:30:39.173 に答える