如何删除std::列表中的一半元素

How to remove half of the elements in a std::list?

本文关键字:列表 一半 元素 std 何删除 删除      更新时间:2023-10-16

我目前正在努力制作,这样当蛇与这种有毒食物碰撞时,列表中的一半就会被删除。

void PlayerSnake::update()
{
    poison_.update();
    int Node_remover_ = Psnake_parts_.size() / 2;
    if (x_ == poison_.x_ && y_ == poison_.y_) {
        Psnake_parts_.remove(Node_remover_);
        //prg::application.exit();
    }
}

我这里的代码目前不起作用。我想知道我需要使用std::list的什么函数来创建它,以便删除该列表中的一半内容。

注意:本文中的实现示例假设最初的一半是应该保存的,如果您只想保留尾部的内容,则必须进行一些调整


简单的实现

即使可以使用std::list的擦除成员函数来擦除元件,更简单的方法是使用电流size减半的resize

#include <iostream>
#include <list>

std::list<int> lst { 1, 2, 3, 4, 5 };
lst.resize ((lst.size () + 1) / 2);
for (auto& elem : lst)
    std::cout << elem << " ";

1 2 3 

注意:lst.size () + 1的原因是,在元素总数不相等的情况下,我们希望保留较大的"半部分"。在这种情况下,我们宁愿保存三个元素,而不是两个


通用实现

#include <iterator>
...
auto position = lst.begin ();
std::advance (position, (lst.size () + 1) / 2);
lst.erase (position, lst.end ());
...

你可能会问自己,为什么这段代码看起来非常难看,原因很简单:我们不能把它写成一个单独的表达式,因为std::list的迭代器只是双向,而不是随机访问

这意味着迭代器不能一次更改它引用的位置一步以上,这就是我们使用std::advance的原因。

halflength = myvector.size()/2;
myvector.erase (myvector.begin(),myvector.begin()+halflength);

试试上面的。下半场你可以在myvector.end()结束。希望它能有所帮助。