[Effective STL]関連コンテナ
8394 ワード
等しい(equlity)と等価(equivalence)の違いを理解する
実際のプロセスでは、等しい概念は
この場合、2つのWidgetは、異なるlastAccessedドメインがあっても等しい値を有することができる.
効率が重要な場合は、map::operator[]とmap::insertの間で慎重に選択してください.
具体的な動作は、operator[]がkに関連付けられた値オブジェクトを指す参照を返します.そしてvは、参照が指すオブジェクトに与えられる.キーkに関連付けられた値が既に存在する場合、その値は更新される.ただし、kがマッピングテーブルに存在しない場合、operator[]が指す値オブジェクトはありません.この場合、値タイプのデフォルトコンストラクション関数を使用して新しいオブジェクトを作成し、operator[]は新しいオブジェクトへの参照を返します.デフォルトのコンストラクション関数をサポートし、double値に基づいて値を構築および付与するWidgetクラスがあるとします.
Note:したがって、「追加」操作を行う場合、insertはoperator[]よりも効率的ですが、更新操作を行う場合、すなわち、等価なキーがマッピングテーブルに存在する場合、状況は逆になります.
STL
には、2つの値が同じかどうかを決定する必要がある関数がたくさんありますが、これらの関数は、2つの値が同じかどうかを異なる方法で判断します.find
対の同じ定義は等価であり、operator ==
をベースとし、set::insert対システムの定義は等価である.そのため、それらの違いを理解する必要があります.実際のプロセスでは、等しい概念は
operator ==
に基づいており、式x==y
が真を返すと、xとyの値は等しくなり、そうでなければ等しくない.しかし、xとyが等しい値を有することは、これらのすべてのデータ・メンバーが等しい値を有することを意味しない.class Widget{
public:
...
private:
TimeStamp lastAccessed;
...
};
bool operator == (const Widget& lhs, const Widget& rhs){
// lastAccessed
}
この場合、2つのWidgetは、異なるlastAccessedドメインがあっても等しい値を有することができる.
効率が重要な場合は、map::operator[]とmap::insertの間で慎重に選択してください.
map
のopeartor[]
の設計目的は、「機能の追加と更新」を提供することです.map<k,v> m;
m[k] = v;
具体的な動作は、operator[]がkに関連付けられた値オブジェクトを指す参照を返します.そしてvは、参照が指すオブジェクトに与えられる.キーkに関連付けられた値が既に存在する場合、その値は更新される.ただし、kがマッピングテーブルに存在しない場合、operator[]が指す値オブジェクトはありません.この場合、値タイプのデフォルトコンストラクション関数を使用して新しいオブジェクトを作成し、operator[]は新しいオブジェクトへの参照を返します.デフォルトのコンストラクション関数をサポートし、double値に基づいて値を構築および付与するWidgetクラスがあるとします.
class Widget{
pulic:
Widget();
Widget(double weight);
Widget& operator=(double weight)
void operator==(const Widget& w);
}
map
を作成し、マッピングテーブルを特定の値で初期化したい.map<int,Widget> m;
m[1] = 1.50;
m[2] = 3.67;
m[3] = 10.5;
m[4] = 45.8;
m[5] = 0.0003;
m[1] = 1.5;
typedef map<int,Widget> IntWidgetMap;
pair<IntWidgetMap::iterator,bool> result = m.insert(IntWidgetMap::value_type(1,Widget())); 1 map 。
result.first->second = 1.5; Widget
insert
m.insert(IntWidgetMap::value_type(1,1.50));
Note:したがって、「追加」操作を行う場合、insertはoperator[]よりも効率的ですが、更新操作を行う場合、すなわち、等価なキーがマッピングテーブルに存在する場合、状況は逆になります.
m[k] = v;
m.insert(IntWidgetMap::value_type(k,v)).first->second = v;
insert
呼び出しでは、IntWidgetMap::value_type
タイプのパラメータを呼び出す必要があるので、insert
を呼び出すときは、このタイプのオブジェクトを構築し、解析する必要があります.Widgetの構造と構造も含まれています.一方、operator[]
はpair
オブジェクトを使用しないので、pair
またはwidget
は構築および析出しません.Note:効率を考慮すると、マッピングテーブルに要素を追加する場合はoperator[]ではなくinsertを優先的に使用します.効率と美学の観点から,マッピングテーブルに既に存在する要素の値を更新する場合にoperator[]を優先的に選択すると結論した.