我有结构向量:
vector<Custom> myvec;
自定义是一种结构:
struct Custom
{
double key[3];
};
如何通过键[0]对 myvec 进行排序。键[1] 或键[2] 使用STL排序算法?
答案 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);