所以我是C ++的新手,我正在研究这个问题,要求我使用向量而不是数组对插入排序进行排序。我已经使用数组进行排序,然后我在代码中做了一些小的改动,试图用向量来解决问题。这就是我现在所拥有的:
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
void fill_array(vector<int> v,int size, int& number_used);
void sort(vector<int> v, int number_used);
void swap_values(int& v1, int& v2);
int main()
{
cout << "This program sorts numbers from lowest to highest.\n";
vector<int> sample;
int number_used;
fill_array(sample,10,number_used);
sort(sample,number_used);
cout << "In sorted order the numbers are:\n";
for (int index =0; index < number_used; index++)
cout << sample[index] << " ";
cout << endl;
system("PAUSE");
return 0;
}
void fill_array(vector<int> v, int size, int& number_used)
{
cout << "This program sorts numbers from lowest to highest.\n";
cout << "Enter up to " << size << " nonnegative whole number.\n"
<< "Mark the end of the list with a negative number.\n";
int index = 0,next;
cin >> next;
while ((next >= 0) && (index < size))
{
v[index]=next;
index++;
cin >> next;
}
number_used = index;
}
void sort(vector<int> v, int number_used)
{
int index;
int index_backwards;
for(index=0;index<number_used;index++)
{
for(index_backwards=index;index_backwards>0;index_backwards--)
{
if(v[index_backwards-1]>v[index_backwards])
{
swap_values(v[index_backwards-1], v[index_backwards]);
}
}
}
}
void swap_values(int& v1, int& v2)
{
int temp;
temp = v1;
v1=v2;
v2=temp;
}
它完成编译就好了。但是当我运行它时,在输入数字并按下回车后,程序就会停止运行并关闭。有没有人可以帮我解决问题?感谢。
答案 0 :(得分:0)
当你像数组一样使用std::vector
时,你会滥用它们。传递矢量的“一边”大小是没有意义的,因为矢量保持自己的大小。
您应该通过引用传递矢量,使用其size()
成员函数而不是count()
,并使用push_back()
为其添加值。您的职能签名应如下:
// Pass by ref; no "size", no "number_used"
void fill_array(vector<int> &v);
// Pass by ref; no "number_used"
void sort(vector<int> &v);
在v.push_back(next)
实施中使用v[index]=next
代替fill_array
。
答案 1 :(得分:0)
在fill_array
函数中,您无法正确添加已向矢量v输入的值。您应该将v[index] = next
更改为v.push_back(next)
。
答案 2 :(得分:0)
您可以更改
v[index]=next;
通过
v.push_back(next);
或者你可以保持它像v [index] = next;并在声明向量时分配内存。
vector<int> sample(10); // This allocates 10 element. DON'T use push_back in this case
当你使用push_back方式并且你知道向量最终会有的元素数量时,在开始填充向量之前调用reserve是一件好事。所以你想做:
vector<int> sample;
sample.reserve(10);
...
// Now fill it with push_back
预留将设置容量或矢量(容量始终> =您的矢量大小)。当容量==到大小时,调用push_back(或任何插入元素的函数)将需要重新分配内存,然后你会受到一些性能影响。使用reserve会阻止这种情况。
此外,拥有自己的交换功能毫无意义。标准库已经具有交换功能。而不是
swap_values(v[index_backwards-1], v[index_backwards]);
你可以做到
std::swap(v[index_backwards-1], v[index_backwards]);