C ++如何从向量中删除-1?

时间:2016-05-26 00:47:04

标签: c++ vector erase

我目前使用此代码进行冒泡排序:

#include <iostream>
#include <vector>
using namespace std;

void bubbleSort(vector<int>& numbers){
    bool notFin = true;
    int temp = 0;
    while(notFin){
        notFin = false;
        for (int i = 0; i< numbers.size(); i++) {
            if (numbers[i]>numbers[i+1] ){
                temp = numbers[i];
                numbers[i] = numbers[i+1];
                numbers[i+1] = temp;
                notFin = true;
            }
        }
    }
}

void printVector(vector<int>& numbers){
    for (int i=0;  i<numbers.size();  i++) {
        cout<<numbers[i]<<" ";
    }
  cout<<endl;
}

int main() {
    vector<int> numbers;
    int n = 0;

    cout << "enter integers to bubble sort end with -1\n";
    while (n != -1) {
        cin >> n;
        numbers.push_back(n);
    }
    numbers.pop_back();

    printVector(numbers);
    bubbleSort(numbers);
    printVector(numbers);
}

当我输出结果时,我仍然在前面看到-1并且最高值消失。如何从向量中删除-1,以便在第二次打印后不输出并推出向量中的最高值?

1 个答案:

答案 0 :(得分:2)

您正在向量外访问。当您到for中的bubbleSort()循环的最后一次迭代时,numbers[i]是向量的最后一个元素,numbers[i+1]在外面。这导致了未定义的行为,在您的情况下,它恰好访问了您最初放入向量中的-1,然后弹出。

更改循环以使用i < numbers.size()-1作为重复测试。

您还可以修复输入循环,这样您就不会首先将-1放入向量中。

while (cin >> n && n != -1) {
    numbers.push_back(n);
}