#include <iostream>
using namespace std;
struct ls{
bool operator()(int lhs, int rhs){
return lhs == rhs;
}
};
int main(){
map<int,string,ls> m1 {{1,"A"},{2,"B"}};
map<int,string>::iterator i;
for(i=m1.begin();i!=m1.end();++i) {
cout<<i->first<<" - "<<i->second<<endl;
}
//If we print data here only 1, "A" data is present.
m1[2] = "C";
for(i=m1.begin();i!=m1.end();++i) {
cout<<i->first<<" - "<<i->second<<endl;
}
//the above statement updates m1[1] as "C" even though we are m1[2]
}
答えて
std::map
の比較関数であるべき第3のテンプレート引数の契約を尊重していないという問題があります。
デフォルトでstd::less<T>
に設定されている比較機能は、std::map
のキーに合計発注を提供する必要があります。
フレーズ「キーの等価性は」比較していないキーの
operator==
によって課される同値関係を意味します。この目的のためにISO規格では、§23.2.4.3で連想コンテナのために、定義されていることすなわち、とk2
の2つのキーは、比較オブジェクトの場合には同等と見なされます。comp
、comp(k1, k2) == false
& &comp(k2, k1) == false
。同じコンテナにあるとk2
の2つのキーの場合、comp(k1, k2)
を呼び出すときは常に同じ値を返します。あなたはauto b1 = ls{}(1, 2); auto b2 = ls{}(2, 1};
が
a
がb
未満とb
ない場合ので、両方のキーが一意のキー(と考えられている、両方のfalse
であることを意味lhs == rhs
としての比較ではありません定義あなたの状況で今
a
未満、a
はb
と等しくなければなりません)。これは、地図作成時に最初のペアのみが挿入されることを意味します。
m1[2] = "C"
を使用すると、2
にマップされた値への参照が取得され、2つの値が関数に応じて1と比較されるため、現在の唯一のキーを更新します。
私は、このようなファンクタを指定すると、17.6.4.8のためUBになるという印象を受けました。だからコードが実際にやっているのはやや投機的ですが、それは実装があなたが記述したことを正確に行うことでしょう。 –
ls
テンプレート引数が間違っています。 std::map
は、厳密な弱い注文を介して比較を実施する必要があります。 ISO C++標準の§23.2.4/ 2としては言う:
各連想コンテナは
Key
とKey
の 要素に厳密弱い順序(...)を誘発する注文 関係Compare
にパラメータ化されます。
http://en.cppreference.com/w/cpp/concept/Compareも参照してください。とりわけ
が、これはすなわちX < X偽でなければならない、Xが自体よりも小さくすることはできませんを意味します。
あなたのls
ファンクタは、まさしくそれを行います。 lhs
が1で、rhs
が1の場合、true
が返されます。これが間違っているという事実は驚くべきことではありません。実際には英語の表現が「何か他のものよりも小さい」ものを説明するための非常に技術的で正式な方法です。は実際には数学やコンピュータサイエンスという意味です。
いずれの場合でも、コードがstd::map
の要件を満たしていないため、プログラムにはの未定義の動作があります。
解決策は簡単です:ls
を使用しないでください。 std::map<int, std::string>
としてマップをインスタンス化してください。デフォルトの引数はstd::less
のインスタンスであるため、正しく動作します。
- 1. このコードが間違って実行されるのはなぜですか?
- 2. それはPHPの更新を行う適切な方法ですか?
- 3. これは、Nodatimeのタイムゾーン間を変換する適切な方法ですか?
- 4. これはSQLでブール・テストを行う適切な方法ですか?
- 5. ロギングフィルタが間違ったハンドラに適用されるのはなぜですか?
- 6. これはRailsアプリケーションの属性を更新するための「適切な」方法ですか?
- 7. このアプリの時間ラベルが毎秒更新されないのはなぜですか?これを行うための良いアイデアですか?
- 8. ここで「間違ったタイプ」のエラーが表示されるのはなぜですか?
- 9. 最後の値が間違っているのはなぜですか?ここ
- 10. なぜRowObjectEventArgsが間違った行を返すのですか?
- 11. これを行うには適切なRxJava演算子は何ですか?
- 12. これは、ITaggable機能を実装する適切な方法ですか?
- 13. これはHistory.jsを使用する適切な方法ですか?
- 14. これは例外を使用する適切な方法ですか?
- 15. テキストクラスタリングがこれを行うのはなぜですか
- 16. なぜこのようにUITableViewのセルを更新するのは間違っていますか?
- 17. C++を学ぶ:これはなぜ違法ですか?
- 18. JavaScriptでこの比較が間違っているのはなぜですか?
- 19. これは適切なMySqlクエリです
- 20. なぜこのフォームは間違ったファイルにリダイレクトされますか?
- 21. javascriptでこれを行う最適な方法は何ですか?
- 22. なぜこのプログラムが間違った結果を返すのですか?
- 23. これは.NETで適切ですか?
- 24. Rはなぜここで合計を間違って実行するのですか?
- 25. なぜこのタイトルのグラフィックはワールドで更新されないのですか
- 26. データベースがこのLINQクエリで更新されないのはなぜですか?
- 27. このUPDATEクエリでテーブルが更新されないのはなぜですか?
- 28. SQL Serverでこれが間違っていると表示されるのはなぜですか?
- 29. このCSSアニメーション(変換:スケール)が間違った場所で開始されるのはなぜですか?
- 30. このRSpecセットアップで間違ったオブジェクトがテストされるのはなぜですか?
[Unable](http://ideone.com/3Zgmc4)を再生する。ところで、カスタムの名前空間で 'operator()'を定義することによって(constメソッドでなければならず、const参照で引数を受け入れる必要があります)、 'std :: map'のテンプレートパラメータとして渡さないでください。 – Jack
ジャック、あなたは両方のエントリを地図で見ることができますか?また、なぜconst refと引数としてメソッドをconstする必要がありますか? –
@Jack:Constメソッド??なぜconst参照で 'int'を取るのですか? –