アソシエーション・コンテナ内のオブジェクトのキーを変更するのはひどい考えですが、私はその標準が厳密にどこから禁止されているのか疑問に思います。考えてみましょう:連想コンテナのキーを変更してみませんか?
#include <map>
#include <memory>
struct X { int i; };
struct lt
{
bool operator()(const std::shared_ptr<X>& lhs,
const std::shared_ptr<X>& rhs) const
{
return lhs->i < rhs->i;
}
};
int main()
{
std::map< std::shared_ptr<X>, int, lt > m;
auto x = std::make_shared<X>();
x->i = 1;
m.insert(std::make_pair(x, 2));
x->i = 42; // change key wrt the container!
}
私は上記のは違法であることを前提としますが、私は今、いくつかの時間のための標準を読んでいたし、私は実際にがそれは違法になります何かを見つけることができません。それはどこにある?それとも、将来の欠陥報告に隠れているのでしょうか?
std :: mapにはツリーの内部構造があります。キーを変更すると、内部構造が正しくないため、間違ったパスを検索するため、検索が機能しません。 – Felics
@Felics:それは問題ではありませんでした。 –
S. Meyersの「Effective STL」には、この問題に関する完全な章があります(項目22を参照)。面白いのは、マップの内部構造を(地図の要素タイプが 'pair'なので)難破するのは難しいですが、そのために何らかのエイリアシングを使用する必要があります。**非常に**難易度が高いsetとmultisetの場合、 'it'が(複数の)set :: iteratorのときに' * it'に代入することができます。 –
shakurov