繁体   English   中英

向量下标超出范围错误,C ++,冒泡排序

[英]Vector subscript out of range error, C++, bubble sort

我需要在C ++中做一个简单的冒泡排序,我想学习如何使用std :: vector。 但是当我运行这个程序时我得到了这个错误...

我不明白为什么...因为我不认为我的迭代超出了范围。

任何想法 ?

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

请注意,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

并有一个内循环

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

end == tab.size()开始,您的if语句将超出范围。 此访问权限是您获得下标超出范围错误的原因。

在C ++数组中,索引从0到length-1,而不是1到length。

半开间隔的技术很有用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM