如何删除std :: list中的一半元素?

时间:2014-03-20 19:54:52

标签: c++ c++11

我正在努力做到这一点,当蛇与这种有毒食物发生碰撞时,此列表中的一半被删除。

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来实现什么功能,以便删除此列表中的一半内容。

2 个答案:

答案 0 :(得分:2)

注意:这篇文章中的实施示例假设前半部分应该保存,如果您只想保留尾部的一些调整必须做。


简单的实施

即使可以使用std::list的擦除成员函数来擦除元素,但更简单的方法是使用resize并将当前size分成两半。

#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的原因是我们在元素总数不均匀的情况下,我们希望保持更大的&#34半部分&#34;。在这种情况下,我们宁愿保存三个元素,而不是两个元素。


共同实施

#include <iterator>

...

auto position = lst.begin ();

std::advance (position, (lst.size () + 1) / 2);

lst.erase (position, lst.end ());

...

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

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

答案 1 :(得分:-1)

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

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