试图使用qsort和向量

16

我正在尝试学习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;
}

7
请允许我第一个给您提出建议:“坚决拒绝!”在一个向量上使用 qsort 简直是疯狂的行为。 - Jerry Coffin
1
你为什么要使用qsort?! - Xeo
4
你似乎假设你的实现使用原始指针作为向量迭代器。是这样吗?但无论如何,你的代码都不应该做出这种假设。使用&numbers[0]而不是numbers.begin() - Benjamin Lindley
2
如果你正在学习C ++,就不要考虑qsort和其他C函数。 - Maxwe11
请使用此处提供的比较器 http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/,并且您应该只调用一次srand,因此最好在主函数中调用它。 - Maxwe11
显示剩余6条评论
1个回答

28

首先,不要这样做。

如果你只是想摆弄一下,你可以使用实际指针替换迭代器:

qsort(&numbers[0], numbers.size(), sizeof(int), compvar);
除了不完成std::sort的所有工作之外,qsort还有一个意外之处,它比较慢。
  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是最快的(使用gnu的g++编译,并带有-O3标志)。

谢谢你的回答,它起作用了!我知道qsort()比sort()慢,这就是我想要测试的,我正在上编程课,教授告诉我们要测试它们两个。再次感谢。 - user1653150

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接