2016-12-31 33 views
-1

我已經制作了這個簡單的代碼來刪除和排序向量的元素。我已經檢查過很多次,當我單獨運行它們時,排序和刪除算法都是正確的,但是存在一個問題,當我刪除一個元素然後按降序對該向量排序時,程序將一個垃圾值設置爲'0'索引,但如果按升序排序,則工作正常。 任何幫助,將不勝感激。謝謝。 這裏是程序1在C++中刪除和排序向量的元素

#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; 
} 
+0

你可能只是做'v1.erase(v.begin()+ delind); std :: sort(v.begin(),v.end());' – Jarod42

+0

請編輯您的帖子,其中包含調試會話的詳細信息,例如哪些語句提供了問題以及語句使用的變量值。同時陳述預期的和實際的價值/行爲。 –

+0

@ Jarod42我懷疑這是一個練習,學習如何遍歷向量。使用庫函數不能實現這一點。很難想出適合圖書館尚未實施的教學法的玩具問題。 – Barmar

回答

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++) 
+0

或簡單地使用'std :: sort'。 – Jarod42

+0

但我已經減少了大小1,當我刪除一個元素,所以它的值已經是3,當涉及到這一步Omada – Waleed

+0

@Waleed'size'從5開始,然後你遞減1,所以它應該是4 。試試打印出「尺寸」可能是什麼? – Omada