1

私は現在、std::map:で[]演算子を使用しています。

map[key] = value;

クレイジーなことは何もありません。ただし、私の値にはconstpublicmemberが含まれています。

class Value
{
public:
    Value(int input) : member(input) { }
    const int member;
};

私のアプリケーションの詳細に立ち入ることなく、constメンバーは私たちが保持したいものです。それを考えると、map[key] = value最初に既存の値を消去してから、新しい値を挿入するようなことをしていると思いました。

map.erase(map.find(key));
map.insert(make_pair(key, value));

ただし、実際に起こっているように見えるのは、operator []が値への参照を返すため、=代入またはムーブ演算子などを使用しようとすることです。明らかに、メンバーを再割り当てできないため、これは機能しません。さて、私は消去を呼び出してから自分自身を挿入するだけで大​​丈夫ですが、map[key] = valueこの「スワップ」手法を使用してプルオフする方法があるかどうか疑問に思いました。

4

2 に答える 2

2

C++でそのようなマップを実装する簡単な方法はありません。考えてみてください。これを行うには、map []がオーバーロードされた代入演算子を使用してプロキシオブジェクトを返すようにする必要があります。このプロキシオブジェクトは、基になるマップでerase and removeを呼び出しますが、参照として動作するように注意する必要があります。右辺値として使用すると、その値になります。参照を返すことは、物事を行うための唯一の賢明な方法であり、より直感的でもあります。

やりたいことをする方法に関しては、おそらくそれを行うための関数を書いて、要素をマップに直接割り当てようとするのではなく、その関数を呼び出す必要があります。

于 2012-08-03T03:39:24.770 に答える
1

マップを次のように定義すると思います。

std::map<Key, Value> mymap;

マップの内部ノードには、最初に渡されたキーと値のコピーが格納されていることに注意してください。スワップセマンティクスを使用する場合は、代わりにValueへのポインターを使用する必要があります。

std::map<Key, std::shared_ptr<Value> > mymap;

and then to change the value will be something like:

mymap[key].reset(new Value(...));
于 2012-08-03T03:57:50.050 に答える