C++ C++;基于成员布尔对向量中的对象进行排序

C++ C++;基于成员布尔对向量中的对象进行排序,c++,class,sorting,object,vector,C++,Class,Sorting,Object,Vector,在我的程序中,我有一些用于在游戏中处理投射物的类 class Projectile { bool IsActive; bool GetActive(); //.... }; class Game { std::vector<Projectile*> ProjectilesToUpdate; //.... }; 类射弹 { 布尔是活跃的; bool GetActive(); //.... }; 班级游戏 { std::向量投影双日期; //.... }; 当然,事情远不止这些,但

在我的程序中,我有一些用于在游戏中处理投射物的类

class Projectile
{
bool IsActive;
bool GetActive();
//....
};

class Game
{
std::vector<Projectile*> ProjectilesToUpdate;
//....
};
类射弹
{
布尔是活跃的;
bool GetActive();
//....
};
班级游戏
{
std::向量投影双日期;
//....
};
当然,事情远不止这些,但我正努力与我目前的问题保持联系

我想使用std::sort使所有IsActive==true的投射物都位于最远的开始处,而任何不活动的投射物都位于最末端


我该怎么做呢?

基本上,您希望创建一个:

关于附属问题:

我必须删除代码中的“const”部分才能使其编译

这是因为您的
GetActive()
方法应该是常量:

bool GetActive() const { return IsActive; }

如何使用它删除不再需要的每个对象(以及指向对象的指针)

您可以使用智能指针(例如
std::shared_ptr
),而不再关心删除。因此,您可以按如下方式使用:

std::vector<std::shared_ptr<Projectile>> ProjectilesToUpdate;
// :
// :
auto it = std::remove_if(
    std::begin(ProjectilesToUpdate), 
    std::end(ProjectilesToUpdate),
    [](std::shared_ptr<Projectile> const& p) { return !p->GetActive(); } // mind the negation
);
ProjectilesToUpdate.erase(it, std::end(ProjectilesToUpdate));
注意,我没有在循环中调用erase,因为它使迭代器无效


当然,最后一种解决方案比使用智能指针更复杂。

建议使用std::partition而不是std::sort的原因是它更有效。可以使用std::sort,但与分区的O(n)相比,它是O(n*log(n))。非常感谢。我知道这可能要求很多,但我在使用它来帮助我时遇到了一些意想不到的麻烦。首先,我必须删除代码中的“const”部分以使其可编译。另外,我如何使用它来删除每一个不再需要的对象(以及指向对象的指针)?@Cupcake1029它有帮助吗?绝对有;多亏了您,内存使用率与以前相比保持不变。在这个过程中我学到了很多,所以非常感谢:)@Cupcake1029如果是这样的话,你介意接受答案吗(如果我没记错的话,答案左边有一个勾号)?谢谢
std::vector<std::shared_ptr<Projectile>> ProjectilesToUpdate;
// :
// :
auto it = std::remove_if(
    std::begin(ProjectilesToUpdate), 
    std::end(ProjectilesToUpdate),
    [](std::shared_ptr<Projectile> const& p) { return !p->GetActive(); } // mind the negation
);
ProjectilesToUpdate.erase(it, std::end(ProjectilesToUpdate));
auto begin = std::begin(ProjectilesToUpdate);
auto end = std::end(ProjectilesToUpdate);
auto start = std::partition(begin, end, 
    [](Projectile const* p) { return p->GetActive(); }
);
for (auto it = start; it != end; ++it) {
    delete *it;
}
ProjectilesToUpdate.erase(start, end);