我的函数应该返回一个指向std :: vector的指针,还是对std :: vector的引用?

Mar*_*Mao 7 c++ stl stdvector

我有一个std::map<int, std::vector<SomeStruct>>,
并提供一个查询std::vector<SomeStruct> FindData(int key).

为了防止复制整个数据,我将其修改为std::vector<SomeStruct>& FindData(int key).
但是,没有确定的数据key,所以有时我没有任何回报.
在这种情况下,我声明一个空的文件范围变量std::vector<SomeStruct>并返回它.

但是如果我选择指向vector的指针,std::vector<SomeStruct>* FindData(int key)那么我就可以返回NULL不存在的指针key.

哪一个更好?
我在问题中学到指针std::vector是坏的(或者很奇怪?不确定)(这个指针操作还有其他语法吗?)
我个人也喜欢参考std::vector,所以我可以使用operator[]更简单,但缺点是我必须为它声明一个额外的空变量.

代码示例如下:In SomeClass.h

typedef std::vector<SomeStruct> DataVec;
typedef std::map<int, DataVec> DataMap;
DataMap m_DataMap;
Run Code Online (Sandbox Code Playgroud)

现在在SomeClass.cpp:

情况1:

namespace
{
    DataVec EmptyVector;
}

DataVec& FindDatas(int key)
{
    DataMap::iterator It = m_DataMap.find(key);

    if (It == m_DataMap.end()) return EmptyVec;

    return It->second;
}
Run Code Online (Sandbox Code Playgroud)

案例2:

DataVec* FindDatas(int key)
{
    DataMap::iterator It = m_DataMap.find(key);

    if (It == m_DataMap.end()) return NULL;

    return &(It->second);
}
Run Code Online (Sandbox Code Playgroud)

参考:
优点:看起来很正常std::vector.
缺点:声明了附加变量.

指针:
优点:查询功能较短,无需其他变量.
缺点:看起来很奇怪(?!),你不能juse p[i],你必须(*p)[i],这很烦人.

哪一个更好?

Sta*_*ked 0

如果您不介意为未找到的密钥创建新条目,则可以使用以下代码:

DataVec& FindDatas(int key)
{
    return m_DataMap[key];
}
Run Code Online (Sandbox Code Playgroud)

另一种方法可以避免为未找到的键添加新条目:

DataVec& FindDatas(int key)
{
    DataMap::iterator It = m_DataMap.find(key);    
    if (It == m_DataMap.end()) {
        // created on first unfound key and stays
        // alive until the end of the program
        static DataVec fEmpty; 
        return fEmpty; 
    }    
    return It->second;
}
Run Code Online (Sandbox Code Playgroud)