【问题标题】:C++ Sorting Objects in a vector based on member booleanC ++基于成员布尔值对向量中的对象进行排序
【发布时间】:2015-05-18 09:25:09
【问题描述】:

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

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

class Game
{
std::vector<Projectile*> ProjectilesToUpdate;
//....
};

当然,还有更多的事情要做,但是我正在努力解决我当前的问题。

我想使用 std::sort 来使 IsActive == true 的所有射弹都在最开始,而任何不活跃的射弹都在最后。

我该怎么做呢?

【问题讨论】:

  • 建议使用 std::partition 而不是 std::sort 的原因是它更有效。可以使用 std::sort ,但与分区的 O(n) 相比,它是 O(n*log(n))。

标签: c++ class sorting object vector


【解决方案1】:

基本上,你想创建一个partition

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

关于附属问题:

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

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

bool GetActive() const { return IsActive; }

Meaning of "const" last in a C++ method declaration?

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

您可以使用智能指针(例如std::shared_ptr)而不再关心删除。因此您可以使用Erase–remove idiom 如下:

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));

相关问题:What is a smart pointer and when should I use one?

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

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);

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

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

【讨论】:

  • 非常感谢。我知道这可能要求很多,但是我在使用它来帮助我时遇到了一些意想不到的麻烦。首先,我必须删除代码中的“const”部分才能使其编译。另外,如何使用它来删除不再需要的每个对象(和指向对象的指针)?
  • @Cupcake1029 有帮助吗?
  • 绝对的;多亏了您,与以前相比,内存使用率保持不变。在这个过程中我学到了很多东西,非常感谢:)
  • @Cupcake1029 在那种情况下,你介意接受答案吗(如果我没记错的话,答案左边有一个勾号)?谢谢。
猜你喜欢
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 2010-10-28
  • 2017-09-17
  • 2015-05-01
  • 2021-06-21
  • 1970-01-01
相关资源
最近更新 更多