C++ 如何正确地从c+中的迭代器返回对对象的引用+;

C++ 如何正确地从c+中的迭代器返回对对象的引用+;,c++,vector,reference,iterator,visual-c++-2010,C++,Vector,Reference,Iterator,Visual C++ 2010,在这样的代码中使用对std::vector元素的引用有问题: class CurrencyList { public: Currency &append(wstring name); private: vector<Currency> mCurrencyList; }; Currency &CurrencyList::append(wstring name){ vector<Currency>::iterator currency

在这样的代码中使用对
std::vector
元素的引用有问题:

class CurrencyList {
public:
    Currency &append(wstring name);
private:
    vector<Currency> mCurrencyList;
};
Currency &CurrencyList::append(wstring name){
    vector<Currency>::iterator currency = findByName(name);
    if(currency != mCurrencyList.end()) 
        return *currency;
    mCurrencyList.push_back(Currency(name));
    return *mCurrencyList.rbegin();
}

当我在第二行收到ProfitVal时,BaseVal的值被损坏。我认为返回*mCurrencyList.rbegin();给我引用迭代器,而不是向量的元素。然后在第二次调用中它发生了变化,第一个值也发生了变化。在这种情况下,我必须如何使用迭代器和引用?

最安全的解决方案是返回
货币的副本:

Currency append(const wstring& name)  // Note the return type.
{
    vector<Currency>::iterator currency = findByName(name);
    if(currency != mCurrencyList.end()) 
        return *currency;
    mCurrencyList.push_back(Currency(name));
    return *mCurrencyList.rbegin();
}
Currency append(const wstring&name)//注意返回类型。
{
vector::iterator currency=findByName(名称);
if(currency!=mCurrencyList.end())
返回*货币;
mCurrencyList.push_back(货币(名称));
return*mCurrencyList.rbegin();
}

请注意,已从函数签名中删除参考符号
&

如果返回类型为
Currency&
,则无法编译对迭代器的引用。来自cplusplus.com:如果发生重新分配,则与容器相关的所有迭代器、指针和引用都将无效。否则,只有结束迭代器无效,并且所有迭代器、指针和对元素的引用都保证继续引用它们在调用之前引用的相同元素。您应该通过常量引用传递
name
Currency&append(const wstring&name)@chris编译正确。这是来自良好编译的代码示例project@ThomasMatthews我添加了const,它的工作原理是一样的:
BaseVal
的值在收到
ProfitVal
后被损坏,非常感谢您的帮助。但在这种情况下,我更喜欢将元素的向量更改为元素上指针的向量
vector
,并手动为其分配内存。我认为在这种情况下,这将是更正确的解决办法。
Currency append(const wstring& name)  // Note the return type.
{
    vector<Currency>::iterator currency = findByName(name);
    if(currency != mCurrencyList.end()) 
        return *currency;
    mCurrencyList.push_back(Currency(name));
    return *mCurrencyList.rbegin();
}