【发布时间】:2013-09-24 15:21:05
【问题描述】:
I 一个向量的向量,每个向量代表一个集合(在数学意义上)。例如:
{{1, 3}, {4, 9, 14}, {1, 3}, {1, 4, 8, 9, 10, 14, 16}, {1, 3, 9}, {4, 9, 17, 22}}
我想让最有效的 C++ 函数能够过滤(如果可能的话)向量,以便删除包含另一个的每个项目。
例如,这里:
-
{1, 3}包含在{1, 3}和{1, 3, 9}中 -
{4, 9, 14}包含在{1, 4, 8, 9, 10, 14, 16}中
结果向量将是:
{{1, 3}, {4, 9, 14}, {4, 9, 17, 22}}
当我开始使用 C++ 时,我真的不知道如何有效地做到这一点。我在这里的其他答案中发现了擦除/删除习语,这在这里似乎不太合适,除非通过将擦除闭包作为谓词传递。这在 C++ 中似乎不太习惯。
请注意,保持原始顺序无关紧要,每个集合中值的顺序也不重要。
【问题讨论】:
-
如果您保持每个向量的排序顺序,那么您应该能够相当有效地做到这一点。
-
{1, 3, 9} 还是 {1, 3, 18}?
-
我想你可以按照 Kerrek 所说的去做:对向量进行排序,然后使用带有适当比较函数的 std::unique 之类的东西。
-
对每个向量进行排序,然后按字典顺序对整个集合进行排序。完成后,您可以穿越,只需要期待看看是否有适当的遏制。
-
“包含”是部分排序。执行拓扑排序,然后丢弃除叶子之外的所有内容。拓扑排序在顶点数加上边数上是线性的;在您的情况下,边数可能是二次的(例如
{{1}, {1, 2}, {1, 2, 3} ...}),因此该算法是二次最坏情况,但如果图形更稀疏可能会更好。
标签: c++ algorithm vector stl filter