嵌套的不同类型的容器

时间:2013-04-18 15:03:37

标签: c++ stl

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

这样我可以遍历集合,将常用操作应用于其所有元素。同时,元素上的一些操作将取决于矢量或地图类型。但是,我假设所有元素必须属于同一类型。

是否有替代方法可以实现这样的目标?

2 个答案:

答案 0 :(得分:2)

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

struct wrapper
{
     int type;  // or enum 
     union {
         vector v;
         map m;
     } content;
};

答案 1 :(得分:1)

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

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

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

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

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

然后,您可能想重新审视原始问题,并发现有一些更简单的方法,首先不需要这样做......并且可能更清晰。