首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++结构排序

C++结构排序
EN

Stack Overflow用户
提问于 2010-04-23 13:21:51
回答 4查看 4.5K关注 0票数 1
  • 我有一个定制结构向量,每次都需要根据不同的标准进行排序。
  • 实现运算符<只允许一个条件
  • 但我希望能够在每次调用C++标准排序时指定排序条件。

怎么做?

  • 请注意,运行时间要有效率比较好。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-23 13:25:07

通过使用第三个参数,可以定义排序算法每次运行中要使用的比较函数:

代码语言:javascript
复制
template <class RandomAccessIterator, class StrictWeakOrdering>
void sort(RandomAccessIterator first, RandomAccessIterator last,
          StrictWeakOrdering comp);

一个简单的例子:

代码语言:javascript
复制
struct person {
   std::string name;
   int age;
};
bool sort_by_name( const person & lhs, const person & rhs )
{
   return lhs.name < rhs.name;
}
bool sort_by_age( const person & lhs, const person & rhs )
{
   return lhs.age < rhs.age;
}
int main() {
   std::vector<person> people;
   // fill in the vector
   std::sort( people.begin(), people.end(), sort_by_name );
   std::sort( people.begin(), people.end(), sort_by_age );
}
票数 13
EN

Stack Overflow用户

发布于 2010-04-23 13:25:48

有两个版本的std::sort,第二个版本接受比较函子:

代码语言:javascript
复制
template <class RandomAccessIterator, class StrictWeakOrdering>
void sort(RandomAccessIterator first, RandomAccessIterator last,
          StrictWeakOrdering comp);
//--------^^^^^^^^^^^^^^^^^^^^^^^

例如:

代码语言:javascript
复制
bool isLessThan(const MyStruct& first, const MyStruct& second) {
   if (first.name < second.name) return true;
   else if (first.name == second.name) {
      if (first.date > second.date) return true;
      // etc.
   }
   return false;
}

...

sort(v.begin(), v.end(), isLessThan);

另见http://www.cplusplus.com/reference/algorithm/sort/

这个变体仍然使用相同的快速排序算法,所以它平均是O(n log )。

票数 2
EN

Stack Overflow用户

发布于 2010-04-23 14:38:23

为了完整起见,下面是一个使用c++0x lambda函数的示例:

代码语言:javascript
复制
std::vector<Person> v;
std::sort(v.begin(), v.end(), [](Person a, Person b) { return a.name_ < b.name_; });
...
std::sort(v.begin(), v.end(), [](Person a, Person b) { return a.address_ < b.address_; });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2698854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档