我有大量的整数需要排序。这里的问题是列表中的每个条目都有许多其他相关元素,当它被排序时需要遵循该int。我通过改变排序来排序双打而不是整数来解决这个问题。我在对每个数字进行排序之前标记了一个小数部分,表示该值在排序之前的原始位置,因此允许我引用它的相关数据并允许我有效地重建包含所有相关元素的排序列表。
我的问题是我想使用函数stable_sort()通过整数对double值进行排序。
我指的是这个网页:http://www.cplusplus.com/reference/algorithm/stable_sort/
然而,由于我是一名新程序员,我不太明白他们是如何设法通过整体工作来实现的。究竟我应该在第三个参数中使用该功能? (我知道我可以复制并粘贴它并让它工作,但我也想学习和理解这一点。)
谢谢,
-Faken
编辑:请注意我是一名没有正式编程培训的新程序员。我正在学习,所以请尽量使你的解释变得简单和基本。
简而言之,请将我视为我以前从未见过c ++代码。
答案 0 :(得分:4)
既然你说你不熟悉矢量(你真的应该尽快学习STL容器),我假设你正在玩数组。这些方面的东西:
int a[] = { 3, 1, 2 };
std::stable_sort(&a[0], &a[3]);
f
的第三个可选参数stable_sort
是一个函数对象 - 也就是说,通过用括号跟随它可以像函数一样调用的任何东西 - {{1 }}。函数(或者更确切地说是指向一个函数的指针)是一个函数对象;其他类型包括重载f(a, b)
的类,但为了您的目的,普通函数可能会这样做。
现在,您的数据类型包含您要排序的operator()
字段,以及一些其他数据:
int
要对此(或任何事情,真的)进行排序,struct foo {
int n;
// data
...
};
foo a[] = { ... };
需要有一些方法来比较任何两个元素,以查看哪一个更大。默认情况下,它只使用运算符stable_sort
进行比较;如果元素类型直接支持它,那就是。显然,<
确实如此;也可以为你的结构重载int
,它也会被拾取,但是你问了一个不同的方法。
这是第三个参数的用途 - 当它被提供时,operator<
每次需要进行比较时调用它,将两个元素作为参数传递给调用。被调用的函数(或函数对象,通常)必须返回stable_sort
如果第一个参数小于第二个用于排序,或true
如果它大于或等于 - 换句话说,它必须像运算符false
本身一样工作(除了你定义你想要比较事物的方式)。对于<
,您只想比较foo
,然后单独留下。所以:
n
现在您通过将指针传递给此函数(仅由其名称表示)到bool compare_foo_n(const foo& l, const foo& r) {
return l.n < r.n;
}
来使用它:
stable_sort
答案 1 :(得分:3)
您需要传递比较功能。像这样:
bool intCompare(double first, double second)
{
return static_cast<int>(first) < static_cast<int>(second);
}
int main()
{
std::vector<double> v;
v.push_back(1.4);
v.push_back(1.3);
v.push_back(2.1);
v.push_back(1.5);
std::stable_sort(v.begin(), v.end(), intCompare);
return 0;
}
在排序算法中,要比较使用您传递的比较函数的值。如果您有一个更复杂的数据结构并想要对数据结构的特定属性进行排序,那么您可以使用此用户定义的函数来比较这些值。
答案 2 :(得分:2)
我相信你在谈论这个功能:
bool compare_as_ints (double i,double j)
{
return (int(i)<int(j));
}
函数调用:
stable_sort (myvector.begin(), myvector.end(), compare_as_ints);
函数compare_as_ints
是一个普通函数,但它作为函数指针传递给stable_sort
。即,正在传递函数的地址,stable_sort
将在内部使用该函数来比较这些值。
如果您对此不清楚,请查看此function pointer tutorial。