我是STL的新手,想知道实现这个的最佳方法: 我想用不同类型的元素嵌套容器。我的想法是一个集合,其元素可以是矢量或地图。
这样我可以遍历集合,将常用操作应用于其所有元素。同时,元素上的一些操作将取决于矢量或地图类型。但是,我假设所有元素必须属于同一类型。
是否有替代方法可以实现这样的目标?
答案 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
类型可以包含迭代内部容器的函数。
然后,您可能想重新审视原始问题,并发现有一些更简单的方法,首先不需要这样做......并且可能更清晰。