【发布时间】:2013-03-20 19:53:45
【问题描述】:
我有一个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。
哪个更好?
我了解到在问题 (Is there other syntax for this pointer operation?) 中指向 std::vector 的指针不好(或奇怪?不确定)
而且我个人也喜欢引用std::vector,这样我可以更轻松地使用operator[],但缺点是我必须为它声明一个额外的空变量。
代码示例如下:在SomeClass.h
typedef std::vector<SomeStruct> DataVec;
typedef std::map<int, DataVec> DataMap;
DataMap m_DataMap;
现在在SomeClass.cpp:
案例一:
namespace
{
DataVec EmptyVector;
}
DataVec& FindDatas(int key)
{
DataMap::iterator It = m_DataMap.find(key);
if (It == m_DataMap.end()) return EmptyVec;
return It->second;
}
案例 2:
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],这很烦人。
哪个更好?
【问题讨论】:
-
返回参考;默认构造的向量是一个轻量级对象,因此周围有额外的
EmptyVector不应该引起任何关注。如果你返回nullptr,所有客户端代码都必须包含一个检查,我个人觉得这比检查空向量更烦人。 -
@Praetorian:我也有类似的想法,所以我更喜欢参考。但是客户端也必须检查
if (p.empty()) return,所以可能仍然存在类似空检查的语句:(