问题描述
||
我想根据一些共同的特征将对
MyObject
(即vector<MyObject*>
)的引用向量划分为2个或更多个子向量。
我有一个等价函数bool belongToSameGroup(MyObject *x,MyObject *y);
,如果MyObject
的某些数据字段相等,则is3ѭ,否则false
。因为这种等效不是通用的,并且仅出于特定目的,所以我不希望重载operator==
。
我可以创建例如<vector<MyObject*>
\(即vector< vector<MyObject*> >
)的向量,以使元素根据等价性在函数belongToSameGroup
下分组的最佳方法是什么?我不想做一堆“ 10”循环,并尽可能多地利用STL算法和容器。
解决方法
我想
std::partition
就是你想要的。 (嘿,甚至在您的问题的标题中!)
, 您可以将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来测试相反的条件,以及另一个以partion_B
值初始化的反向插入器inserter_B
。
与ѭ11相比,此方法的两个优点是1)它不改变原始向量,因此很可能会使用更多的场景(例如,涉及常量迭代器的情况),以及2)可以在不使用原始容器的容器上运行具有双向迭代器,例如std::list
等。
, 您不需要一堆for
循环,只需要对向量运行std::for_each
并决定如何处理每个元素。或使用std::partition
(如果您可以将它们放在刚刚重组的同一个容器中)。
如注释中所述-在C ++ 11标准中,“ 10”支持以前需要“ 24”的功能。