按照状态排列向量中的元素

sig*_*agi 0 c++ boost

我们有简化的课程:

class A
{
   bool val_;
   public:
     A() : val_(true) {}
     bool isNew() const { return val_; }
     void setDirty() { val_ = false; }
};
Run Code Online (Sandbox Code Playgroud)

以及这类对象的向量:

vector<A> coll;
coll.push_back(A());
coll.push_back(A());
coll.push_back(A());
coll.push_back(A());
coll[1].setDirty();
coll[3].setDirty();
Run Code Online (Sandbox Code Playgroud)

我需要一些优雅的解决方案来重新排列(排序)向量中的元素,以便未修改的对象将在序列的开头分组.

Vla*_*mir 6

您可以使用标准库中的分区算法:

bool MyPredicate(A& a) { return a.isNew();}
...
// bound is iterator pointing to the first element for which predicate returns false
vector<A>::iterator bound = partition(coll.begin(), coll.end(), MyPredicate);
Run Code Online (Sandbox Code Playgroud)

或者,正如Christian Rau建议的解决方案没有单独的功能:

std::partition(coll.begin(), coll.end(), std::mem_fun_ref(&A::isNew))
Run Code Online (Sandbox Code Playgroud)