3

私のセット:

std::set<Object> objects;

オブジェクトを見つけて参照として返し、存在しない場合は挿入します。

const Object& get(params...){
    Object obj(params...);
    std::set<Object>::const_iterator i = objects.find(obj);
    if(i != objects.end())
        return *i;
    objects.insert(obj);
    return * objects.find(obj);
}

これにより、セグメンテーション違反が発生する可能性がありますか、それとも常に機能しますか?

4

3 に答える 3

1

コレクションで何をするかによって異なります。

からの挿入と削除std::setは、コレクションの他の要素へのイテレータを無効にしませんが、コレクションからその要素を消去しようとすると、イテレータとその要素への参照が無効になり、無効な参照になる可能性があります。

于 2013-02-04T18:08:21.977 に答える
0

このコード自体ではありません。ただし、オブジェクトを消去しても、後でその参照を使用しようとする場合があります

于 2013-02-04T18:12:13.697 に答える
0

消去を使用する予定がない場合にも、このポリシーを強くお勧めしません。将来の変更により、厄介なバグが発生する可能性があります。

オブジェクトが十分に小さい場合は、コピーで返送してください。

オブジェクトが非常に大きい場合は、ブーストスマートポインターを使用してセグメンテーション違反を回避できます。

于 2013-02-04T18:23:18.097 に答える