循环间隔意外更改
Loop interval changing unexpectedly
我正在编写一个循环来从数组中删除每三个元素,直到只剩下一个元素。
这是代码...
int elimcnt = 1;//counts how many elements looped through
int cnt = 0;//counts how many elements deleted for printing purposes
for (int i = 0; v.size() > 1; i++, elimcnt++) {
if (i == v.size()) {//reset i to the beginning when it hits the end
i = 0;
}
if (elimcnt%in.M == 0 && elimcnt != 0) {//in.M is elimination index which is 3
v.erase(v.begin() + (elimcnt%v.size()) - 1);
cnt++;
if (cnt%in.K == 0) {//in.K is how often you will print which is after 7 deletes
print_vector(v, cnt);
}
}
}
当我运行它时实际发生的事情是它会正确删除第一个元素,但之后它会从那里删除每 4 个元素。
下面是一个示例输入...
A1 A2 A3 A4 A5 A6 A7 A8 A9 B1 B2 B3
B4 B5 B6 B7 B8 B9 C1 C2 C3 C4 C5 C6
C7 C8 C9 D1 D2 D3 D4 D5 D6 D7 D8 D9
E1 E2 E3 E4 E5
应该输出什么...
A1 A2 A4 A5 A7 A8 B1 B2 B4 B5 B7 B8
C1 C2 C4 C5 C6 C7 C8 C9 D1 D2 D3 D4
D5 D6 D7 D8 D9 E1 E2 E3 E4 E5
这是实际输出的内容...
A1 A2 A4 A5 A6 A8 A9 B1 B3 B4 B5 B7
B8 B9 C2 C3 C4 C6 C7 C8 D1 D2 D3 D4
D5 D6 D7 D8 D9 E1 E2 E3 E4 E5
我似乎无法弄清楚是什么导致代码这样做,因此任何帮助将不胜感激。
问题出在语句中使用的表达式中
v.erase(v.begin() + (elimcnt%v.size()) - 1);
^^^^^^^^^^^^^^^^^^^^^
考虑一系列数字
1, 2, 3, 4, 5, 6
对于序列的第一次遍历,您需要删除3
并6
删除 3 后,您将获得
1, 2, 4, 5, 6
删除后的变量elimcnt
将递增并等于 4。但是,序列的大小现在等于 5。因此,当 elimcnt
等于 6 时,表达式 elimcnt%v.size()) - 1
将等于 0,元素 1 将被删除。
我可以建议一种使用迭代器的更安全的方法。
例如
size_t elimcnt = 0;//counts how many elements looped through
size_t cnt = 0;
for (auto it = v.begin(); v.size() > 1; it == v.end() ? it = v.begin() : it )
{
if (++elimcnt % in.M == 0)
{
it = v.erase(it);
if (++cnt % in.K == 0)
{
print_vector(v, cnt);
}
}
else
{
++it;
}
}
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- c++ 中 while 循环的意外行为
- 为什么我在循环提升时得到意外的索引::hana::元组
- 在 winapi 回调函数上返回 FALSE 时出现意外行为(循环被跳过?
- 如果在循环中给cin一个意外的输入,则会自动输入C++换行符作为输入
- C++ 循环意外结束
- 循环间隔意外更改
- For循环内特定行的意外迭代
- C++ 子类和运算符=:无限循环和意外调用
- Arduino UNO在执行更复杂的程序时意外循环Serial
- 当循环意外终止时(C/C++)
- 简单的 C++ for 循环意外输出
- for循环中的意外行为
- 一次执行后,嵌套for循环出现意外/未见的中断:高斯消去
- 使用if循环排序时出现意外结果-糟糕的算法
- 使用循环和函数向映射中插入值时的意外行为
- c++中循环字符时的意外结果
- 循环依赖c意外错误或只是一个糟糕的设计