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

Cup*_*029 2 c++ sorting class vector object

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

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

class Game
{
std::vector<Projectile*> ProjectilesToUpdate;
//....
};
Run Code Online (Sandbox Code Playgroud)

当然,除此之外还有更多,但我试图保持与当前问题的相关性.

我想使用std :: sort来制作它,以便IsActive == true的所有射弹都处于远端,并且任何非活动的射弹都在最后.

我该怎么做呢?

Hiu*_*ura 9

基本上,您要创建一个分区:

std::partition(std::begin(ProjectilesToUpdate),
               std::end(ProjectilesToUpdate), 
               [](Projectile const* p) { return p->GetActive(); }
);
Run Code Online (Sandbox Code Playgroud)

至于附属问题:

我不得不删除代码中的"const"部分以使其编译.

那是因为你的GetActive()方法应该是const:

bool GetActive() const { return IsActive; }
Run Code Online (Sandbox Code Playgroud)

在C++方法声明中看到"const"的含义是什么?

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

您可以使用智能指针(例如std::shared_ptr),而不再关心删除.因此,您可以使用Erase-remove惯用法,如下所示:

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));
Run Code Online (Sandbox Code Playgroud)

相关问题:什么是智能指针,什么时候应该使用?

如果你不想使用智能指针,你可以使用返回的迭代器,它指向第二组的第一个元素(即非活动的)并迭代直到数组的结尾:

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);
Run Code Online (Sandbox Code Playgroud)

请注意,我没有在循环内调用erase,因为它使迭代器无效.

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