我有一个函数原型:
void bubbleSort(std::vector<float>);
和实施:
void bubbleSort(std::vector<float> inputVector)
{
std::cout << "Executing bubble sort." << std::endl;
int pass;
int comparisons;
float hold;
for (pass = 1; pass < VECSIZE; pass++)
{
for (comparisons = 0; comparisons < VECSIZE - 1; comparisons++)
{
if (inputVector[comparisons] > inputVector[VECSIZE + 1])
{
hold = inputVector[comparisons];
inputVector[comparisons] = inputVector[comparisons + 1];
inputVector[comparisons + 1] = hold;
}
}
}
for (int i = 0; i < VECSIZE; i+=10)
{
std::cout << "Element " << i << " is " << inputVector[i] << std::endl;
}
return;
}
从main
:
#define VECSIZE 1000
int main(void)
{
std::string fileName = "randFloats.txt";
std::cout << "Processing " << fileName << "..." << std::endl;
std::ifstream fileInput(fileName);
//vector to hold the floats
std::vector<float> fltVector(VECSIZE);
if(fileInput.is_open())
{
std::string line;
int i = 0;
while(getline(fileInput, line))
{
fltVector[i] = (::atof(line.c_str()));
i++;
}
}
bubbleSort(fltVector);
}
基本上,main函数接受一个1000个元素长的浮点文件,将其读入一个向量结构,然后将其发送到要排序的函数。由于我已经完成了某种语言指针的工作,所以已经太久了,所以当我将std::vector<float>
传递给bubbleSort
函数时,我发现它没有输出有序向量。我如何将向量传递给函数以使其排序?
这里需要冒泡排序...我只是出于自己的目的这样做,以便通过内存管理来恢复自我。
这是一个用于测试的输入文件: 1000 Line file
答案 0 :(得分:5)
有几个问题。其中一些是:
向量按值传递,而不是按引用传递,因此您正在修改本地副本。
您正在访问越界数据:inputVector[VECSIZE + 1]
不存在。
使用inputVector.size()
代替使用VECSIZE
宏。理想情况下,使用begin()
,end()
和迭代器。
根本不需要VECSIZE
。只需在阅读循环中附加向量:
while(getline(fileInput, line))
fltVector.push_back(::atof(line.c_str()));
“自从我用语言中的指针完成任何工作已经太久了”它是C ++,你可以做很多而不用直接触摸指针:)
答案 1 :(得分:1)
您正通过值将矢量传递给您的函数:
void bubbleSort(std::vector<float>);
这意味着您要对矢量的副本进行排序,而不是实际的矢量。您需要将功能签名更改为
void bubbleSort(std::vector<float>&);
^ -- note the pass by reference
您遇到的另一个问题是您正在调用未定义的行为:
if (inputVector[comparisons] > inputVector[VECSIZE + 1])
^^^^^^^^^^^ -- accessing an element 2 beyond
数组的大小,并且您没有交换正在比较的项目。
我认为你想要做的是:
bool swapped = false;
do
{
swapped = false;
for (int j = 0; j < inputVector.size() - 1; ++j)
{
if (inputVector[j + 1] > inputVector[j])
{
std::swap(inputVector[j + 1], inputVector[j]);
swapped = true;
}
}
} while (swapped);
请注意此修复的问题:
if (inputVector[comparisons] > inputVector[VECSIZE + 1]) // UB
{
hold = inputVector[comparisons];
inputVector[comparisons] = inputVector[comparisons + 1]; // not swapping elements you compared!
inputVector[comparisons + 1] = hold; // same problem as above!
}
答案 2 :(得分:0)
每次将最高元素放在最后,所以每次都不需要与数组的结尾进行比较:
bool swapped = false;
int k = inputVector.size();
do
{
k--;
swapped = false;
for (int j = 0; j < k; j++)
{
if (inputVector[j] > inputVector[j + 1])
{
std::swap(inputVector[j], inputVector[j + 1]);
swapped = true;
}
}
} while (swapped);