如何删除std::列表中的一半元素
How to remove half of the elements in a std::list?
我目前正在努力制作,这样当蛇与这种有毒食物碰撞时,列表中的一半就会被删除。
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()
结束。希望它能有所帮助。
相关文章:
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 通过for循环使用用户输入填充列表
- C++:如何使函数只返回作为列表一部分的字符串
- 概念中的cv限定符需要表达式参数列表
- 下面是我为检测链接列表中的循环而制作的代码
- 建议在运行时将带有类实例的列表从c++导入qml
- 如何维护资源管理器项目视图中当前可见的项目列表
- 在卡萨布兰卡形成编码参数的列表
- 如何删除std::列表中的一半元素