我正在尝试将选择排序与向量一起使用。我运行该程序,它完成第一部分未分类但后面说表达式:向量下标超出范围。无法弄清楚造成它的原因。
#include <iostream>
#include <vector>
using namespace std;
template<typename Comparable>
void selectionSort(vector<Comparable> & toSort)
{
int pos, min, i;
for( pos = 0; pos < 30; ++pos)
{
min = toSort[pos];
for( i = toSort[pos + 1]; i < toSort[30]; ++i)
{
if( i < min)
{
min = i;
}
}
if( min != pos)
{
std::swap(toSort.at(min), toSort.at(pos));
}
}
}
int main(int argc, const char * argv[])
{
const int NUM_ITEMS = 5;
int array[NUM_ITEMS] = { 16, 271, 77, 40, 120 };
vector<int> sortingVector;
for(int i=0;i<NUM_ITEMS;i++) {
sortingVector.push_back(array[i]);
}
cout << "Before sort \n";
for(int i=0;i<NUM_ITEMS;i++) {
cout << sortingVector[i] << "\n";
}
selectionSort(sortingVector);
cout << "After sort \n";
for(int i=0;i<NUM_ITEMS;i++) {
cout << sortingVector[i] << "\n";
}
system("pause");
return 0;
}
答案 0 :(得分:1)
没人知道这个神奇的数字30在你的功能中意味着什么
template<typename Comparable>
void selectionSort(vector<Comparable> & toSort)
{
int pos, min, i;
for( pos = 0; pos < 30; ++pos)
{
min = toSort[pos];
for( i = toSort[pos + 1]; i < toSort[30]; ++i)
甚至函数本身也不知道这个神奇的数字30意味着什么。
如果您使用标准容器std::vector
,那么它具有成员函数size
,它可以始终报告容器中有多少元素。
在任何情况下,如果你使用size()而不是30,则代码无效,因为内部循环将访问位置等于size()的元素
for(i = toSort [pos + 1] ; i&lt; toSort [30] ; ++ i)
我认为应该有
for( i = pos + 1; i < toSor.size(); ++i)
这个条件
if( min != pos)
也无效,因为您正在比较不同的实体。
可以通过以下方式定义该功能
template<typename Comparable>
void selectionSort( std::vector<Comparable> & toSort )
{
for ( std::vector<Comparable>::size_type pos = 0; pos < toSort.size(); ++pos )
{
std::vector<Comparable>::size_type min = pos;
for ( std::vector<Comparable>::size_type i = pos + 1; i < toSort.size(); ++i )
{
if ( toSort[i] < toSort[min] ) min = i;
}
if ( min != pos )
{
std::swap( toSort[min], toSort[pos] );
}
}
}
答案 1 :(得分:0)
for( pos = 0; pos < 30; ++pos)
{
min = toSort[pos];
如果您必须以这种特定方式执行此操作,请考虑在排序函数中使用NUM_ITEMS
作为范围检查,而不是使用0到29。
for( i = toSort[pos + 1]; i < toSort[30]; ++i)
{
您正在此处直接访问元素30,尽管向量只有5个元素。请务必检查pos + 1
,因为这可能会在以后导致错误。