我有一个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],这很烦人.
哪一个更好?
如果您不介意为未找到的密钥创建新条目,则可以使用以下代码:
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)
| 归档时间: |
|
| 查看次数: |
5555 次 |
| 最近记录: |