STL排序问题

时间:2010-12-10 12:21:30

标签: c++ sorting stl

我有结构向量:

vector<Custom> myvec; 

自定义是一种结构:

struct Custom
{
   double key[3];
};

如何通过键[0]对 myvec 进行排序。键[1] 键[2] 使用STL排序算法?

4 个答案:

答案 0 :(得分:12)

编写自定义比较器:

template <int i> struct CustomComp
{
  bool operator()( const Custom& lhs, const Custom& rhs) const
  {
    return lhs.key[i]<rhs.key[i];
  }
};

然后排序,例如使用std::sort(myvec.begin(),myvec.end(),CustomComp<0>());(按第一个键输入排序)

或者使用更新的编译器(支持c ++ 0x lambda):

std::sort(myvec.begin(), myvec.end(),
  []( const Custom& lhs, const Custom& rhs) {return lhs.key[0] < rhs.key[0];}
);

答案 1 :(得分:10)

使用自定义比较器。

struct CustomLess {
    size_t idx;
    CustomLess(size_t i) : idx(i) {}
    bool operator()(Custom const& a, Custom const& b) const {
        return a.key[idx] < b.key[idx];
    }
};

然后

std::sort(myvec.begin(), myvec.end(), CustomLess(1)); // for 1

注意:我没有使用模板,因为使用模板使编译器能够针对该特定索引进行优化,这会阻止您在运行时选择索引,例如基于userinput,因此灵活性较差/不能与非模板版本一样多。众所周知,过早优化是邪恶的:)

答案 2 :(得分:2)

我不确定为什么这么多的答案都集中在仿函数上。不需要具有OP规定要求的仿函数。以下是2个非仿函数解决方案:

1:过载运算符&lt;在自定义类

bool Custom::operator< (const Custom& rhs)
{
    return key[0] < rhs.key[0];
}

// can call sort(myvec.begin(), myvec.end());

2:创建自定义比较功能

template<int i> bool CustomLess(const Custom& lhs, const Custom& rhs)
{
    return lhs.key[i] < rhs.key[i];
}

// can call sort(myvec.begin(), myvec.end(), CustomLess<0>);

答案 3 :(得分:0)

bool CompareCustoms(const Custom& lhs, const Custom& rhs)
{
    // Compare criteria here
    return (lhs.key[0] < rhs.key[0]);
}
sort(myvec.begin(), myvec.end(), CompareCustoms);