3

オブジェクトがすでに。内に含まれているかどうかを判断しようとしていますstd::set。msdn(およびその他のソース)によると、set :: find関数はend()、要求した要素が見つからない場合に返されるはずです。

ただし、次のようなコードを実装すると、代わりにset::findjunk(0xbaadf00d)が返されます。

set<Cell*> cellSet;

Cell* cell = new Cell();    

if (cellSet.find(cell) == cellSet.end())
{
    ...
}

私はこれを正しく使用していますか?Visual C++2005で作業しています。

4

5 に答える 5

10

投稿されたコードは、常に内のコードを実行しif実装の「最後から1つ」のマーカーになります。0xbaadf00d

于 2009-05-04T16:48:18.480 に答える
5

stl setを使用するときは、count関数を使用してメンバーシップを決定するのが好きです。これでコードが読みやすくなると思います。

set<Cell*> cellSet;

Cell* cell = new Cell();    

if (cellSet.count(cell) == 0)
{
    ...
}
于 2009-05-04T17:12:43.460 に答える
1

callSet.end()の値も0xbaadf00dですか?

編集

このサンプルコードをVS2008で実行したところ、すべてが期待どおりに機能しました。find関数は、元の値を指すイテレータを返しました。

あなたは正確にどのような行動を見ていますか?end()を返しますか、それともセット内の別の場所を返しますか?

于 2009-05-04T16:45:06.537 に答える
0

単純な間違いの1つは、終わりと等しくないかどうかをテストする必要があるということです。

set<Cell*> cellSet;
Cell* cell = new Cell();
if (cellSet.find(cell) != cellSet.end())     // Test NOT EQUAL to end
{
     // Found item in set.
}

ただし、実際のCell値ではなく、Cellオブジェクトへのポインター(必要な場合とそうでない場合があります)を比較していることにも注意してください。通常、C ++では、ポインターの暗黙の所有権がないため、コンテナーにポインターを格納する傾向はありませんが、場合によっては問題ありません。

オブジェクトを実際に比較するには、find_if()を使用して、述語(ファンクター)を渡す必要があります。

struct PointerCellTest
{
    Cell&  m_lhs;
    PointerCellTest(Cell* lhs): m_lhs(lhs) {}
    bool operator()(Cell* rhs)
    {
         return lhs.<PLOP> == rhs.<PLOP>
    }
};


if(find_if(cellSet.begin(),cellSet.end(),PointerCellTest(cell)) != cellSet.end())
{
     // Found item in set.
}
于 2009-05-04T17:23:12.247 に答える
0

提供したコードスニペットだけをコンパイルして実行してみてください。問題なく実行されることが保証されます。この問題は、初期化されていないポインタや、deletedされたオブジェクトへのポインタを参照するなど、プログラムの他の場所で発生するメモリ割り当てのバグが原因であることがほぼ確実です。

C ++コンテナがオブジェクトを管理する方法に精通していますか?彼らはあなたのためにポインタを削除しません。可能であれば、オブジェクトへのポインタではなく、オブジェクトのコンテナを使用する方が常に安全です。(ポインターのコンテナーが必要な場合があります。特に、コンテナーに単一のクラス階層からの異なるタイプのオブジェクトを保管させたい場合です。)

于 2009-05-04T16:57:53.510 に答える