将对象矢量划分为2个或更多个子组

时间:2011-05-27 23:28:44

标签: c++ stl

我想基于一些共同特征将MyObject(即vector<MyObject*>)的引用向量划分为2个或更多个子向量。

我有等效函数bool belongToSameGroup(MyObject *x, MyObject *y);,如果true的某些数据字段相等,则为MyObject,否则为false。因为这种等价不是一般性的,仅用于特定目的,所以我不想重载operator==

我可以创建一个最好的方法,例如<vector<MyObject*>的向量(即vector< vector<MyObject*> >),以便根据函数belongToSameGroup下的元素对元素进行分组?我不想做一堆for循环,尽可能多地利用STL算法和容器。

3 个答案:

答案 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的功能。