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

C++ 返回对数据结构拥有的对象的引用,c++,C++,我的套装: std::设置对象; 我希望找到一个对象并将其作为引用返回,如果它不存在,也要插入它: std::set<Object> objects; const对象和get(参数…){ 对象对象对象(参数…); std::set::const_迭代器i=objects.find(obj); 如果(i!=objects.end()) 返回*i; 插入(obj); 返回*objects.find(obj); } 这可能会导致分段错误,或者这将始终有效?取决于您对集合所做的操作 从

我的套装:

std::设置对象;
我希望找到一个对象并将其作为引用返回,如果它不存在,也要插入它:

std::set<Object> objects;
const对象和get(参数…){
对象对象对象(参数…);
std::set::const_迭代器i=objects.find(obj);
如果(i!=objects.end())
返回*i;
插入(obj);
返回*objects.find(obj);
}

这可能会导致分段错误,或者这将始终有效?

取决于您对集合所做的操作


std::set
插入和删除不会使集合中其他元素的迭代器无效,但如果要从集合中删除该元素,则迭代器和对该元素的引用将无效,并且可能最终导致无效引用。

不是此代码本身。但是您可能会删除一个对象,并且以后仍尝试使用它的引用

我强烈建议您不要使用此策略。如果您不打算使用擦除,将来的修改可能会导致严重的错误

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


如果对象相当大,也许你可以使用Boost智能指针来避免分割错误。

可能的复制可能是(如果你使用指针,考虑使用智能指针),但是不知道应用程序的逻辑是很难说的。我想这完全取决于您是否需要引用语义。也许这会有助于澄清事实上智能指针并不合适,因为返回指针时不会有所有权。除非你想让整个容器包含
共享\u ptr
或其他东西。@SethCarnegie:这就是我的意思。容器将是一个
集合
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);
}