我想基于一些共同特征将MyObject
(即vector<MyObject*>
)的引用向量划分为2个或更多个子向量。
我有等效函数bool belongToSameGroup(MyObject *x, MyObject *y);
,如果true
的某些数据字段相等,则为MyObject
,否则为false
。因为这种等价不是一般性的,仅用于特定目的,所以我不想重载operator==
。
我可以创建一个最好的方法,例如<vector<MyObject*>
的向量(即vector< vector<MyObject*> >
),以便根据函数belongToSameGroup
下的元素对元素进行分组?我不想做一堆for
循环,尽可能多地利用STL算法和容器。
答案 0 :(得分:5)
我认为std::partition
就是你想要的。 (嘿,它甚至在你问题的标题中!)
答案 1 :(得分:3)
您可以将std::remove_copy_if
与后插入迭代器一起用于std::vector<MyObject*>
。所以这看起来像(TESTFUNCTION是你的函数,它采用类型MyObject*
并返回bool
):
std::vector<MyObject*> original;
std::vector<MyObject*> partion_A;
std::back_insert_iterator<std::vector<MyObject*> > inserter_A(partion_A);
std::remove_copy_if(original.begin(), original.end(), inserter_A, TESTFUNCTION);
现在partition_A
将包含TESTFUNCTION为true的所有值。如果你想要第二个分段向量partion_B
,只需要创建另一个测试相反条件的TESTFUNCTION_B,以及用值inserter_B
初始化的另一个后插入器partion_B
。
与std::partition
相比,此方法的两个优点是:1)它不会更改原始向量,因此最有可能使用更多场景(即涉及常量迭代器的情况),以及2)它可以在没有双向迭代器的容器上运行,如std::list
等。
答案 2 :(得分:-1)
您不需要一堆for
循环,只需在向量上运行std::for_each
并决定如何处理每个元素。或者如果您可以将它们放在同一容器中,则使用std::partition
,只需重新组织。
正如评论中所提到的 - 在C ++ 11标准中,for
支持以前需要std::for_each
的功能。