2

我是 STL 的新手,想知道实现这一点的最佳方法:我想用不同类型的元素嵌套容器。我的想法是一个集合,它的元素可以是向量或地图。

通过这种方式,我可以遍历该集合,将通用操作应用于其所有元素。同时,对元素的一些操作将依赖于矢量或地图类型。但是,我假设所有元素都必须属于同一类型。

是否有替代方案来实施这样的事情?

4

2 回答 2

2

您不能将两种不同类型的对象放入标准容器中。您要做的就是将容器“包裹”在另一个“知道”它实际持有的对象类型的对象中。boost::variant<T1, T2 ... >是一种相对标准的做法。如果您不能使用 boost 库,那么您可能会发现这样的东西可以正常工作:

struct wrapper
{
     int type;  // or enum 
     union {
         vector v;
         map m;
     } content;
};
于 2013-04-18T15:11:23.093 回答
1

语言并不真正支持您尝试做的事情,虽然您可以使其工作,但它不会简单或优雅。sftrabbit 建议的方法(一旦你修复了语法:))可以让你成功,但迭代需要创建一个访问者,可能需要一个函子来应用于元素;为了能够在有序容器中使用它,您需要将其包装在提供排序的类型中......

您预期设计的另一个问题是std::set不允许修改嵌套元素,这基本上意味着一旦将容器添加到容器中,std::set它们就会变得不可变。如果这没问题,您可以采用不同的方法,只需在包含到外部std::vector<ElementType*>保持 a指向所有现有元素。这将让您以更简单的线性方式迭代所有元素。std::set

一个更简单的解决方案可能是创建一个类来替换外部容器并在内部std::set为每个嵌套容器保存两个不同的(再次假设不变性不是问题,或者如果需要,可以使用不同的容器):

class Container {
   std::set<std::vector<Type>> d_vectors;
   std::set<std::map<Key,Type>> d_maps;
...

然后该Container类型可以包含迭代内部容器的函数。

再说一次,您可能想重新审视最初的问题,并发现有一些更简单的方法一开始就不需要这个……而且可能更干净。

于 2013-04-18T15:21:45.493 回答