与qsort()
类似,似乎C ++ std::sort()
不允许将用户数据传递给sort函数。
例如:
像struct A { int version; int index; } array[100]
这样的结构数组必须按顺序排序,但使用此数组struct B { int value; } key[100]
作为排序键。 struct A::index
索引数组key
。
这是一个非工作排序功能。它需要以某种方式指向key
数组:
bool comp(struct A *a1, struct A *a2) {
return key[a1->index].value < key[a2->index].value;
}
如何使用C ++实现这一目标?如何将key
等非全局用户数据传递给排序函数?
我尝试将对象实例作为std::sort
comp传递,但似乎只有qsort()
- 允许使用类似的函数。
(在GNU C中,嵌套比较函数可用于使用作用域变量,但GNU C ++不提供嵌套函数。)
答案 0 :(得分:7)
Functors不一定是函数;它们可以是物体。
struct Comparator {
Comparator(int* key) : key(key) {};
bool operator()(struct A *a1, struct A *a2) {
return key[a1->index].value < key[a2->index].value;
}
int* key;
};
/* ... */
std::sort(container.begin(), container.end(), Comparator(<pointer-to-array>));
答案 1 :(得分:2)
您可以准确地告诉sort
如何使用比较函数进行排序。
工作示例:
struct Foo
{
int a_;
std::string b_;
};
Foo make_foo(int a, std::string b)
{
Foo ret;
ret.a_ = a;
ret.b_ = b;
return ret;
}
struct ByName : public std::binary_function<Foo, Foo, bool>
{
bool operator()(const Foo& lhs, const Foo& rhs) const
{
return lhs.b_ < rhs.b_;
}
};
template<class Stream> Stream& operator<<(Stream& os, const Foo& foo)
{
os << "[" << foo.a_ << "] = '" << foo.b_ << "'";
return os;
}
int main()
{
vector<Foo> foos;
foos.push_back(make_foo(1,"one"));
foos.push_back(make_foo(2,"two"));
foos.push_back(make_foo(3,"three"));
sort(foos.begin(), foos.end(), ByName());
copy(foos.begin(), foos.end(), ostream_iterator<Foo>(cout, "\n"));
}
输出:
[1] = 'one'
[3] = 'three'
[2] = 'two'