vector,set,map怎么排序

小塔-皂荚花 2014-04-29 10:27:39
vector中的元素是可以重复的,set和map中的元素是不可以重复的,set和map中的元素默认是升序排序的,我想知道如何做可以让set和map使用自己定义的方式去排序,就像java中的compare函数一样。最好能给个例子,口说无凭,谢谢各位了!
...全文
238 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2014-05-05
  • 打赏
  • 举报
回复
引用 9 楼 huangsir2011 的回复:
[quote=引用 7 楼 mujiok2003 的回复:]
引用
set和map中的元素默认是升序排序的,我想知道如何做可以让set和map使用自己定义的方式去排序
template < class T,                        // set::key_type/value_type
           class Compare = less<T>,        // set::key_compare/value_compare
           class Alloc = allocator<T>      // set::allocator_type
           > class set;
template < class T,                        // set::key_type/value_type
           class Compare = less<T>,        // set::key_compare/value_compare
           class Alloc = allocator<T>      // set::allocator_type
           > class set;
set,map都可以自己提供Compare模板实参的呀。
具体怎么用,可以写个例子吗,口说无凭。[/quote]

//from http://www.cplusplus.com/reference/map/map/map/
// constructing maps
#include <iostream>
#include <map>

bool fncomp (char lhs, char rhs) {return lhs<rhs;}

struct classcomp {
  bool operator() (const char& lhs, const char& rhs) const
  {return lhs<rhs;}
};

int main ()
{
  std::map<char,int> first;

  first['a']=10;
  first['b']=30;
  first['c']=50;
  first['d']=70;

  std::map<char,int> second (first.begin(),first.end());

  std::map<char,int> third (second);

  std::map<char,int,classcomp> fourth;                 // class as Compare

  bool(*fn_pt)(char,char) = fncomp;
  std::map<char,int,bool(*)(char,char)> fifth (fn_pt); // function pointer as Compare

  return 0;
}

幻夢之葉 2014-05-05
  • 打赏
  • 举报
回复
自己写仿函数排序!!
赵4老师 2014-05-05
  • 打赏
  • 举报
回复
bool fncomp (char lhs, char rhs) {return lhs>rhs;}
 
struct classcomp {
  bool operator() (const char& lhs, const char& rhs) const
  {return lhs>rhs;}
};
mujiok2003 2014-05-04
  • 打赏
  • 举报
回复
引用
set和map中的元素是不可以重复的
另外有multiset,和multimap可以处理重复的情况。
mujiok2003 2014-05-04
  • 打赏
  • 举报
回复
引用
set和map中的元素默认是升序排序的,我想知道如何做可以让set和map使用自己定义的方式去排序
template < class T,                        // set::key_type/value_type
           class Compare = less<T>,        // set::key_compare/value_compare
           class Alloc = allocator<T>      // set::allocator_type
           > class set;
template < class T,                        // set::key_type/value_type
           class Compare = less<T>,        // set::key_compare/value_compare
           class Alloc = allocator<T>      // set::allocator_type
           > class set;
set,map都可以自己提供Compare模板实参的呀。
赵4老师 2014-05-04
  • 打赏
  • 举报
回复
引用 4 楼 huangsir2011 的回复:
[quote=引用 2 楼 zhao4zhong1 的回复:] http://www.cplusplus.com/reference/map/map/operators/ http://www.cplusplus.com/reference/set/set/operators/
怎么直接用等于不等于来做。[/quote] 只给出元素之间等于和不等于的实现,怎么可能将元素按升序或降序排序呢? 你只能重载 <, >, <= , >= 才行吧。
暗黑Zero 2014-05-04
  • 打赏
  • 举报
回复

struct xxtype
{
    int num1, num2;
};
bool operator < (const xxtype &a , const xxtype &b)
{
    return a.num1 < b.num1;
}

set<xxtype> the_set;
对于你自定义的类/结构体,可以直接自己重载小于号做。
「已注销」 2014-05-04
  • 打赏
  • 举报
回复
set等有比较器,自已根据需求写
小塔-皂荚花 2014-05-04
  • 打赏
  • 举报
回复
引用 7 楼 mujiok2003 的回复:
引用
set和map中的元素默认是升序排序的,我想知道如何做可以让set和map使用自己定义的方式去排序
template < class T,                        // set::key_type/value_type
           class Compare = less<T>,        // set::key_compare/value_compare
           class Alloc = allocator<T>      // set::allocator_type
           > class set;
template < class T,                        // set::key_type/value_type
           class Compare = less<T>,        // set::key_compare/value_compare
           class Alloc = allocator<T>      // set::allocator_type
           > class set;
set,map都可以自己提供Compare模板实参的呀。
具体怎么用,可以写个例子吗,口说无凭。
小塔-皂荚花 2014-05-02
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
http://www.cplusplus.com/reference/map/map/operators/ http://www.cplusplus.com/reference/set/set/operators/
怎么直接用等于不等于来做。
小塔-皂荚花 2014-05-02
  • 打赏
  • 举报
回复
引用 1 楼 u011493668 的回复:
用boost库里的多索引 自定义排序方式
boost是什么库,可以给写下demo吗?
l_journey_91 2014-04-29
  • 打赏
  • 举报
回复
用boost库里的多索引 自定义排序方式

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧