用C ++

时间:2016-12-31 19:20:13

标签: c++ sorting

我已经制作了这个简单的代码来删除和排序向量的元素。我已经多次检查了,当我单独运行它们时,排序和删除算法都是正确的,但是有一个问题,当我删除一个元素然后按降序对矢量进行排序时,程序会将一个值放在' 0'索引,但如果我按升序排序,则工作正常。 任何帮助,将不胜感激。谢谢。 以下是程序1

的示例运行图像
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    bool flag = 1;
    int size = 5,delind;

    vector <int> v1;
    v1.resize(size);

    for(int i = 0; i<size; i++)
    {
        cout<<"\nenter a no. ";
        cin>>v1[i];
    }

    // index of the element to be deleted
    cout << "\nEnter the index of no. to delete: ";
    cin >> delind;

    for(int i = delind; i < size; i++)
    {
        v1[i] = v1[i+1];
    }
    --size;
    v1.erase(v1.begin()+size);

    for(int i =0; i < size; i++)
    {
        cout << endl << endl << v1[i];
    }
    cout << "\n sorting";
    // sorting

    while (flag == 1)
    {
        flag = 0;

        for(int i = 0; i < size; i++)
        {
            if(v1[i] < v1[i+1]) // works fine with if(v1[i]>v1[i+1]) 
            {
                flag = 1;
                swap(v1[i],v1[i+1]);
            }
        }
    }

    for(int i = 0; i < size; i++)
    {
        cout << endl << endl << v1[i];
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您的排序部分出现了一个错误。在以下几行中:

for(int i = 0;i<size;i++)
{
  if(v1[i]<v1[i+1]) // works fine with if(v1[i]>v1[i+1]) 
  {
    flag = 1;
    swap(v1[i],v1[i+1]);
  }
}

此时size为4,v1.size()也为4.在for循环中,i像往常一样从0变为3。但是您正在使用v1[i+1],因此您的循环将尝试访问v1[4],这超出了界限并为您提供了所见的垃圾值。

要修复它,只需修复你的循环边界:

for (int i = 0; i < size - 1; i++)