2016-04-13 15 views
-2

のデバッグ私は特別な順序でセットを書きました。のstd ::設定の問題

ListCases.find(9); 

への呼び出しは、逆参照可能なイテレータを返さないため、値9を削除できません。 しかし、私は、次のループでそのセットのすべての値を印刷するとき:

for (auto & eVal : ListCases) 
    std::cerr << " " << eVal; 

私は値9は、格納された値のリストに含まれていることがわかります。

別のプログラムでコードを分離すると、バグが消えます。コンパイルオプション-fsanitize = undefinedでclang ++を実行すると、他のチェックで何も返されませんでした。

これについてはどのような説明がありますか?他にどのようなデバッグオプションが考えられますか?

+0

逆参照できないイテレータを返さないとはどういう意味ですか? – SergeyA

+0

あなたの実際のコードは実際の関数でセットを初期化していますか?さもなければ、すべての賭けはかなり離れている。 – molbdnilo

+0

完全なサンプルプログラムがあれば、ここで助けになります。 A *推測*は、あなたの比較関数が正しく機能していないことになります。キー(ints)に厳密な弱い順序を課す必要があります。比較関数は何をしますか? –

答えて

0

あなたは比較機能を提供していますか?私はこのプログラムがクラッシュしますラムダ[](int l, int r){ return l<r; }と機能を提供していない場合は、コード

typedef std::set<int,std::function<bool(int const&,int const&)>> MySet; 

MySet wListCases([](int l, int r){ return l<r; }); 

wListCases.insert(9); 
wListCases.insert(88); 
wListCases.insert(1); 

auto found = wListCases.find(9); 

for (auto & eVal : wListCases) 
    std::cout << " " << eVal << std::endl; 

のこの部分を使用して

。それ以外の場合は、9を見つけて印刷します。1, 9, 88