使用向量而不是C ++中的数组对从最小到最大的数字进行排序

时间:2015-04-12 10:32:50

标签: c++ arrays sorting vector

所以我是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;
}

它完成编译就好了。但是当我运行它时,在输入数字并按下回车后,程序就会停止运行并关闭。有没有人可以帮我解决问题?感谢。

3 个答案:

答案 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]);