我有一个std::map<int, std::vector<SomeStruct>>
,
并提供一个类似的查询std::vector<SomeStruct> FindData(int key)
。
为了防止复制整个数据,我将其修改为std::vector<SomeStruct>& FindData(int key)
.
但是,肯定不会有数据key
,所以有时我没有什么可以返回的。
在这种情况下,我声明一个为空的文件范围变量std::vector<SomeStruct>
并返回它。
但是,如果我选择指向向量的指针,std::vector<SomeStruct>* FindData(int key)
那么我可以只返回NULL
不存在的key
.
哪一个更好?
我在问题中了解到指针std::vector
不好(或奇怪?不确定)(此指针操作是否有其他语法?)
而且我个人也喜欢引用std::vector
,这样我可以operator[]
更轻松地使用,但缺点是我必须为它声明一个额外的空变量。
代码示例如下:在SomeClass.h
typedef std::vector<SomeStruct> DataVec;
typedef std::map<int, DataVec> DataMap;
DataMap m_DataMap;
现在在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;
}
案例二:
DataVec* FindDatas(int key)
{
DataMap::iterator It = m_DataMap.find(key);
if (It == m_DataMap.end()) return NULL;
return &(It->second);
}
参考:
优点:看起来很正常std::vector
。
缺点:声明了附加变量。
指针:
优点:查询功能更短,不需要其他变量。
缺点:看起来很奇怪(?!),你不能开玩笑p[i]
,你必须这样做(*p)[i]
,这很烦人。
哪一个更好?