2016-04-08 8 views
0

C++で単純なバブルソートを行う必要があり、std :: vectorの使い方を知りたい。しかし、私はこのプログラムを実行すると、私はこのエラーが発生しました...範囲外のベクトル下付き文字エラー、C++、バブルソート

なぜ私は私の反復が範囲外にないと思うので...私は理解していない。

#include <iostream> 
#include <vector> 

using namespace std; 

void triABulle(vector<int>&, int, int); 
void echanger(vector<int>&, int, int); 
void affiche(vector<int>&); 

int main() { 

vector<int> tab = { 3, 4, 56, 3, 2, 5, 64, 3453, 34 }; 
affiche(tab); 
triABulle(tab, 0, tab.size()); 
cin.get(); 
return 0; 
} 

void triABulle(vector<int>& tab, int begin, int end) { 

for (size_t i = 1; i <= end-begin; i++) 
{ 
    for (size_t j = end; j >= begin+i; j--) 
    { 
     if (tab[j] < tab[j-1]) 
     { 
      echanger(tab, j, j-1); 
      cout << "SWAP!" << endl; 
      affiche(tab); 
     } 
    } 
    } 
} 

void echanger(vector<int>& tab, int i, int j) { 
    int tmp = tab[i]; 
    tab[i] = tab[j]; 
    tab[j] = tmp; 
} 

void affiche(vector<int>& tab) { 
    for (size_t i = 0; i < tab.size() ; i++) 
    { 
     cout << tab[i] << ' '; 
    } 
    cout << endl; 
} 
+0

'私は'末端ある場合=エンドbegin'を< - タブ[エンド開始]は 'の端を越えて一つの要素である'ように、アレイ内のbegin'要素は、それらが0によってインデックス付けされますベクター。例えば。 'end-begin'が1の場合、' tab [0] 'は配列内の唯一の要素です。しかし、 '<='を使用しているので、 'tab [1]'にアクセスしようとします。 – kfsone

答えて

0

C++配列インデックスでは、0からlength-1になり、lengthは1になりません。

半開きのテクニックは便利です。

for (int i = 0; i < end-begin; i++) 
{ 
    for (int j = end-1; j >= begin+i; j--) 
+0

ありがとうございました!!!うん、私はこの技術をうまくチェックすると思う –

1

C++が0インデックスであることに注意してください、なインデックスが0でこれを始める意味する我々は

vector<int> tab = { 3, 4, 56, 3, 2, 5, 64, 3453, 34 }; 

を宣言した場合、アクセス

tab[tab.size()] 

が範囲外になることを意味しています。あなたも

triABulle(tab, 0, tab.size()); // so tab.size() == end 

を呼び出し、文がend == tab.size()ので、範囲外になる場合

for (size_t j = end; j >= begin+i; j--) { 
    if (tab[j] < tab[j-1]) // results in going out of bounds 
    { 
     ... 
    } 
} 

あなたの内側のループを持っていることを確認します。このアクセスは、下付き文字が範囲外のエラーになる理由です。

+0

お返事ありがとうございます!なぜそれが間違っていたのか分かりました... –

関連する問題