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

问题描述

|| 我想根据一些共同的特征将对
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”的功能。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...