Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 循环间隔意外更改_C++_Unix - Fatal编程技术网

C++ 循环间隔意外更改

C++ 循环间隔意外更改,c++,unix,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 t

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

这是代码

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);
        }
    }
}
当我运行它时,实际发生的情况是,它将正确地删除第一个元素,但在那之后,它将从那里删除每第四个元素

下面是一个输入示例

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
这就是实际输出的内容

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

从数组中,数组没有成员begin。如果v是一个向量,erase会使迭代器和引用在erase点或之后失效,包括end()迭代器,并且可以想象,大小也会发生变化。与其破坏正在迭代的向量,为什么不创建一个新的向量并输入所需的值?