我正在努力做到这一点,当蛇与这种有毒食物发生碰撞时,此列表中的一半被删除。
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
来实现什么功能,以便删除此列表中的一半内容。
答案 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()
下半场结束。
希望它会有所帮助。