循环间隔意外更改

时间:2017-10-10 19:48:33

标签: c++ unix

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

这是代码......

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

我似乎无法弄清楚导致代码执行此操作的原因,因此将非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

问题出在语句

中使用的表达式中
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;
    }
}