C++?无法在开始之前寻找向量迭代器

yue*_*ong 5 c++ iterator vector

我正在做一个uva问题uva 10935扔卡片,我的代码如下。当我运行它时,它说引发了未处理的异常:读取访问冲突,并且还显示“无法在开始之前寻找向量迭代器”,我不知道我的代码中的问题出在哪里:

#include<vector>
#include<iostream>
using namespace std;
int n;
vector<int> out;


int main() {
    freopen("data.txt", "r", stdin);
    while (scanf("%d", &n) == 1 && n) {
        vector<int> cards;
        for (int i = 1; i <= n; i++)cards.push_back(i);
        vector<int>::iterator it = cards.begin();
        vector<int>::iterator end = cards.end();
        while (it != (end-1)) {
            out.push_back(*it);
            it++;
            cards.push_back(*it);
            it++;
            end++;
        }
        cout << "Discarded cards: ";
        for (int j = 0; j < out.size(); j++) {
            if(j!=(out.size()-1))cout << out[j] << ", ";
            else cout << out[j] << endl;

        }
        cout << "Remaining card: " << *it << endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Edu*_*eff 2

我认为 end++ 和其他迭代器有问题。

如果向量卡增长,其内存位置可能会改变,end++将指向无效位置。类似的情况也发生在 it++ 上。

我建议您改用列表:

#include<bits/stdc++.h>
using namespace std;
int n;

int main() {
    //freopen("a.in", "r", stdin);

    while (scanf("%d", &n) == 1 && n) {

        list<int> out;

        list<int> cards;
        for (int i = 1; i <= n; i++)
          cards.push_back(i);
        list<int>::iterator it = cards.begin();

        list<int>::iterator end = cards.end();
        end--;
        while (it != (end)) {
            out.push_back(*it);
            it++;
            cards.push_back(*it);
            it++;
            end++;
        }
        cout << "Discarded cards: ";
        list<int>::iterator it2 = out.begin();
        for (int j = 0; j < out.size(); j++, it2++) {
            if(j !=(out.size()-1))
               cout << *it2 << ", ";
            else
              cout << *it2 << endl;
        }
        cout << "Remaining card: " << *it << endl;
    }
    return 0;
}

Run Code Online (Sandbox Code Playgroud)

注意:我还没有读过 UVA 问题。