将矢量传递给qsort
Passing vector to qsort
本文关键字:qsort 更新时间:2023-10-16
我正在尝试使用qsort对类Entry的向量中的"sth"整数值进行排序。相同的代码如下。但在应用qsort之后,值也保持不变。当我尝试打印cmpfunc2((中的值时,我发现0 0正在打印。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Entry{public:
int id;
int sth;
Entry(int,int);
};
Entry::Entry(int a,int b){
id=a;
sth=b;
}
int cmpfunc2 (const void * a, const void * b)
{
cout<<(*(Entry *)a).sth<<" "<<(*(Entry *)b).sth <<endl;
return ( (*(Entry*)a).sth - (*(Entry*)b).sth );
}
int main(){
vector<Entry> entries;
entries.push_back(Entry(2,3));
entries.push_back(Entry(21,14));
entries.push_back(Entry(54,12));
qsort(&entries, entries.size(),sizeof(Entry),cmpfunc2);
for(int i=0;i<entries.size();i++)
cout<<entries[i].sth<<endl;
}
更改此语句
qsort(&entries, entries.size(),sizeof(Entry),cmpfunc2);
至
qsort( entries.data(), entries.size(), sizeof( Entry ), cmpfunc2 );
然而,最好使用在报头<algorithm>
中声明的标准算法std::sort
。例如
#include <algorithm>
//...
bool cmpfunc2 ( const Entry &a, const Entry &b )
{
return ( a.sth < b.sth );
}
// ...
std::sort( entries.begin(), entries.end(), cmpfunc2 );
或者你可以使用std::stable_sort
std::stable_sort( entries.begin(), entries.end(), cmpfunc2 );
还考虑将Entry
类型的对象与std::pair
类型的对象进行比较的可能性。在这种情况下,sth相等的对象将根据id进行排序。例如
#include <algorithm>
#include <utility>
//...
bool cmpfunc2 ( const Entry &a, const Entry &b )
{
return ( std::make_pair( a.sth, a.id ) < std::make_pair( b.sth, b.id ) );
}
好的,我将发表我的评论作为回答。
首先,查看qsort的文档。第一个参数ptr-指向要排序的数组的指针。
因此,如果你真的想将qsort与向量一起使用(这很奇怪,std::sort就在那里(,你的问题的答案就是">如何将向量转换为原始数组?"问题的答案。
你需要使用一个小黑客-&entry[0]-指向矢量第一个元素的指针。它是有效的,因为向量中的元素,就标准而言,具有连续的内存位置,这与原始数组相同。
在新标准中,向量有data((函数成员。您可以使用此成员函数
您将&entries
传递给qsort
,它应该是:
qsort(&entries[0], entries.size(), sizeof(Entry), cmpfunc2);
A(将std::sort()
与entries.begin()
和entries.end()
->更快的一起使用
或
B(使用qsort()
和&entries.front()
,而不是&entries
->较慢的
相关文章:
- Qsort() 比较结构体整数的总和
- 如果我们不从 std::qsort 返回 0 会发生什么?
- qsort 不适用于我的 impl 中的浮点类型。怎么了?
- qsort 比较函子的分段错误
- 相同的结果 qsort vs std::sort
- Qt:qSort 而不使用复制构造函数
- 外部 C 和 C++ 对于单个函数(bsearch / qsort)的目的是什么?
- 如何获取指向 qsort 第一个参数的向量中第一项的指针?
- Qsort和不兼容的比较器功能 - C++
- 我如何使用Qsort对结构(由几个不同元素组成)进行排序
- 使用 Qt qSort() 在数组上调用 qSort
- 什么是 qsort void*x 和 *(int*)x?
- c/c qsort在结构内的结构阵列
- qsort C++是否曾经将元素与自身进行比较?
- 与在C 中使用QSORT相比,我该如何将一百万个数字分组
- 为什么在此代码中,C++中的排序比 C 中的 qsort 慢得多(对于字符串数组)
- 我应该在C++中使用 qsort 而不是排序吗?
- 使用 qsort() 进行稳定排序?
- qsort C++:调用'qsort'没有匹配函数
- 它如何排列单词以使用 qsort 和字符串