循环间隔意外更改

Loop interval changing unexpectedly

本文关键字:意外 循环      更新时间:2023-10-16

我正在编写一个循环来从数组中删除每三个元素,直到只剩下一个元素。

这是代码...

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

对于序列的第一次遍历,您需要删除36

删除 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;
    }
}