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