web-dev-qa-db-ja.com

ベクトルでqsortを使おうとしています

私はc ++を学ぼうとしていて、sortとqsortを使おうとしていました。 sort()は問題なく動作しますが、qsortは動作しません。理由はわかりません。これが、コンパイルしようとしていたコードです。

#include<iostream>
#include<vector>
#include<cstdlib>
#include<ctime>
#include<algorithm>


using namespace std;

int compvar(const void *one, const void *two)
{
    int a = *((int*)one);
    int b = *((int*)two);
    if (a<b)
       return -1;
    if (a == b)
       return 0;
    return 1;   

}

void bvect(vector<int> &vec, int num)
{
     srand(time(NULL));
     for(int i=0; i<num; ++i)
             vec.Push_back(Rand()%1000 + 1);
}

void showvec(vector<int> vec)
{
     for (int i=0; i<vec.size(); ++i)
         cout<<vec[i]<<endl;
}


int main()
{
    vector<int>numbers;
    bvect(numbers, 1000);
    showvec(numbers);
    qsort(numbers.begin(), numbers.size(), sizeof(int), compvar);
    showvec(numbers);

    return 0;
}
15
user1653150

まず第一に、しないでください。

いじくり回したいだけの場合は、イテレータを実際のポインタに置き換えることができます。

_qsort(&numbers[0], numbers.size(), sizeof(int), compvar);
_

_std::sort_が行うすべての作業を実行しないこととは別に、qsortについて予期しないことが1つあります。 遅いです。

  1. sort (myvector1.begin(), myvector1.end());

  2. sort (myvector2.begin(), myvector2.end(), myfunction);

  3. sort (myvector3.begin(), myvector3.end(), myobject);

  4. qsort(&myvector4[0], myvector4.size(), sizeof(int), cmyfunction);

4が最も遅く、2が続きます(関数ポインターは_std::sort_に渡されます)。 1と3(デフォルトとファンクター)が最速です(-O3フラグ付きのgnuのg ++​​でコンパイルされています)。

22
Ivan