返回对数据结构所拥有的对象的引用

时间:2013-02-04 18:04:57

标签: c++

我的设置:

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);
}

这会导致分段错误,或者这会一直有效吗?

3 个答案:

答案 0 :(得分:0)

取决于您对该系列的处理方式。

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

答案 1 :(得分:0)

不是这个代码本身。但是你可能会删除一个对象并仍然试图稍后使用它的引用

答案 2 :(得分:0)

如果你不打算使用擦除,我强烈反对这项政策,未来的修改可能会导致令人讨厌的错误。

如果您的对象足够小,请通过复制返回。

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