我正在编写一个循环来删除数组中的每个第三个元素,直到只剩下一个元素。
这是代码......
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
我似乎无法弄清楚导致代码执行此操作的原因,因此将非常感谢任何帮助。
答案 0 :(得分:1)
问题出在语句
中使用的表达式中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;
}
}