向量下标超出范围错误,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
{
...
}
}
您的 if 语句自 end == tab.size()
起将越界。此访问是您得到下标超出范围错误的原因。
在 C++ 中,数组索引从 0 到长度 1,而不是 1 到长度。
半开区间技术很有用。
for (int i = 0; i < end-begin; i++)
{
for (int j = end-1; j >= begin+i; j--)
我需要用 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
{
...
}
}
您的 if 语句自 end == tab.size()
起将越界。此访问是您得到下标超出范围错误的原因。
在 C++ 中,数组索引从 0 到长度 1,而不是 1 到长度。
半开区间技术很有用。
for (int i = 0; i < end-begin; i++)
{
for (int j = end-1; j >= begin+i; j--)