如何使用qsort函数对一组对进行排序? 这是我的设置:
set< pair< int, int> > my_set
我想这应该是我的比较功能:
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
我的qsort应该是这样吗?
qsort (my_set, no_of_pairs, sizeof(int), compare);
当我对它们进行排序时,我想按二维数组**M;
的值进行排序,其中
M[my_set.first][my_set.second] = the_value
答案 0 :(得分:1)
首先,首选使用c ++ std容器将std :: sort转换为qsort。
其次,你不能对std :: set a posteriori进行排序。 std::set
已排序。
但是,您可以使用第二个模板参数为instanciation的std :: set指定自定义排序。
请参阅规格。
如果你需要在事后对数据进行排序,你可以做的是使用std :: vector。有一种算法可以剔除重复值。
这个提出的解决方案假设M是一个全局变量。
#include <algorithm>
bool less_than(const std::pair<int, int> &some, const std::pair<int, int> &other) {
return M[some.first][some.second] < M[other.first][other.second];
}
std::sort(yourvector.begin(), yourvector.end(), less_than);
如果M不是全局变量,你可以这样做:
struc Compair { // see what I did there ? #sofunny
bool operator() (const std::pair<int, int> &some, const std::pair<int, int> &other) {
return M[some.first][some.second] < M[other.first][other.second];
}
int **M;
}
然后在主要:
Compair mycomparefunctor;
mycomparefunctor.M = arr; // arr is the original int **
std::sort(yourvector.begin(), yourvector.end(), mycomparefunctor);
编辑:
如果您必须使用std::set
,则应在声明时定义自定义顺序,如下所示:
Compair mypredicate;
mypredicate.M = arr; // arr is the original int **
std::set<std::pair<int, int>, mypredicate> myset;
// add stuff to the set. They will be sorted following your predicate.
小心但是:在一个集合中你不能添加2个比较相等的项目。因此,如果你的int ** 2D数组有几个相等的值,你就不可能有几个对应于集合中相等值的索引。
答案 1 :(得分:0)
你真的错了。
假设我们知道该对中每个成员的最大值。如果你不知道这一点,那么你需要搞清楚。我将假设它是100
。
然后我们需要做的就是遍历集合,并将它们插入到新数组中。没有更快的方法可以解决这个问题。
int M[100][100] = {};
for (auto const & pair : my_set)
M[pair.first][pair.second] = the_value;