如何传递用户数据来比较std :: sort的功能?

时间:2011-04-20 15:57:30

标签: c++ sorting stl

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 ++不提供嵌套函数。)

2 个答案:

答案 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'