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

取决于你对收藏做什么。

从 an 中插入和删除std::set不会使集合中其他元素的迭代器无效,但如果您要从集合中删除元素,则迭代器和对它的引用将失效,您最终可能会得到一个无效的引用.

于 2013-02-04T18:08:21.977 回答
0

不是这个代码本身。但是您可能会擦除一个对象,但稍后仍会尝试使用它的引用

于 2013-02-04T18:12:13.697 回答
0

如果您不打算使用擦除,我也强烈反对此策略,将来的修改可能会导致讨厌的错误。

如果您的对象足够小,请通过副本返回它。

如果对象很大,也许您可​​以使用 boost 智能指针来避免分段错误。

于 2013-02-04T18:23:18.097 回答