我有以下内容:
class Obj;
typedef std::map<string, string> StrMap;
std::map<std::string, std::pair<Obj, StrMap> > complexMap;
问题在于,对于复杂映射中的某些条目,StrMap将为空,我根本不会使用它,因此为了提高效率,我考虑使用boost :: optional。我的问题是boost :: optional的效率如何,我担心通过支付其价格最终将一无所获。
我有以下内容:
class Obj;
typedef std::map<string, string> StrMap;
std::map<std::string, std::pair<Obj, StrMap> > complexMap;
问题在于,对于复杂映射中的某些条目,StrMap将为空,我根本不会使用它,因此为了提高效率,我考虑使用boost :: optional。我的问题是boost :: optional的效率如何,我担心通过支付其价格最终将一无所获。
把optional
看作是一个可以容纳0或1个值的容器。你的map已经是一个可以容纳0到N个元素的容器了。因此,一个可选的map就是一个容器中的容器,可以容纳0到N个元素。但实际上,并没有什么好处。
一个空map的开销非常小。从内部来看,map实际上是由map节点构建的,而一个空map就没有任何节点。(它不能有,因为每个节点都有一个值,而一个空map无法创建默认值)
complexMap
,并使用boost::optional
封装每个元素的稀疏性。unordered_map
),其中包含指向complexmMap
中现有元素的指针。这将在每个地图的基础上封装稀疏性。complexMap
尽可能小,但需要更多的编程工作。complexMap
中进行千兆字节级别的计算,则额外的间接层可能会有所回报,否则我不会费心)。boost::optional
几乎没有其他成本,因为它不需要默认构造函数或动态内存分配。可选
确实有意义(例如返回值,其中您想指示无效状态,或者您有一个非常昂贵的构造函数,它对复杂成员进行大量初始化的情况),但对于具有微不足道构造函数的对象,可选真的不值得代码混乱。