stl map

yhcelebrite 2012-04-23 07:04:17
map 中怎么设置多个key值进行排序以及它们的优先级(例子解释)
...全文
178 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhcelebrite 2012-05-01
  • 打赏
  • 举报
回复
感谢楼上,很强大!
pathuang68 2012-04-25
  • 打赏
  • 举报
回复
参考下面的代码,应该满足楼主的要求

#include <iostream>
#include <string>
#include <map>
using namespace std;

class key
{
public:
int k1;
int k2;

key(int x, int y):k1(x), k2(y)
{
}

friend bool operator < (const key&, const key&);
};

bool operator < (const key& key1, const key& key2)
{
// 按k1升序 + k2升序排列
//if(key1.k1 != key2.k1) return (key1.k1 < key2.k1);
//else return (key1.k2 < key2.k2);

// 按k1降序 + k2升序降序
//if(key1.k1 != key2.k1) return (key1.k1 > key2.k1);
//else return (key1.k2 > key2.k2);

// 按k1升序 + k2降序排列
//if(key1.k1 != key2.k1) return (key1.k1 < key2.k1);
//else return (key1.k2 > key2.k2);

// 按k1降序 + k2升序排列
if(key1.k1 != key2.k1) return (key1.k1 > key2.k1);
else return (key1.k2 < key2.k2);
}

int main(int argc, char** argv)
{
map<key, string> str_map;
str_map.insert(make_pair(key(2, 1), "hello"));
str_map.insert(make_pair(key(2, 2), "world"));
str_map.insert(make_pair(key(1, 2), "HELLO"));
str_map.insert(make_pair(key(1, 1), "WORLD"));

map<key, string>::iterator iter;
for(iter = str_map.begin(); iter != str_map.end(); ++iter)
{
cout << iter->first.k1 << "\t" << iter->first.k2 << "\t" << iter->second << endl;
}

//vector<key> vec;
//vec.push_back(key(1, 1));
//vec.push_back(key(1, 2));
//vec.push_back(key(2, 1));
//vec.push_back(key(2, 2));

//sort(vec.begin(), vec.end(), comparer);

//vector<key>::iterator iter;
//for(iter = vec.begin(); iter != vec.end(); ++iter)
//{
// cout << (*iter).k1 << "\t" << (*iter).k2 << endl;
//}

return 0;
}
pathuang68 2012-04-24
  • 打赏
  • 举报
回复
一楼给出的方法是可行的。
你可以将两个key:k1, k2放到一个struct中,然后在用这个struct的实例作为map的key。

在比较的时候,你可以先比较k1,如果k1是相等的话,就比较k2
yhcelebrite 2012-04-24
  • 打赏
  • 举报
回复

class Link
{
public:
int row;
int col;
Link(int i,int j)
{
row=i;
col=j;
next=null;
}
Link *next;
};

list<Link> listlink;
list<Link>::iterator p;
p=listlink.begin();
p->row或者p->col这样指向有效吗?
yhcelebrite 2012-04-24
  • 打赏
  • 举报
回复

class Link
{
public:
int row;
int col;
Link(int i,int j)
{
row=i;
col=j;
next=null;
}
Link *next;
};

list<Link> listlink;
list<Link>::iterator p;
p=listlink.begin();
p->row或者p->col这样指向有效吗?
yhcelebrite 2012-04-24
  • 打赏
  • 举报
回复
不是key的重复,是key的优先级,多个key不过有优先级!
cattycat 2012-04-23
  • 打赏
  • 举报
回复
对,multimap和multiset这两个才能存key重复的吧。
qq120848369 2012-04-23
  • 打赏
  • 举报
回复
multimap才能存储相同的key。
evencoming 2012-04-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
如果是set 要求其按两个关键值(int a[i][j])i相比较 j相比较)谓词怎么实现?

即set<class T,predicate> 这个谓词predicate该怎么写?
[/Quote]
T的类型是?
如果是类似下面的这样:

class A
{
int **a;
int i,j;
public:
bool operator<(const A&rhs)const
{
if(i<rhs.i)
return true;
else
{
return rhs.i==i?j<rhs.j:false;
}
}
};
然后 predicate就是这个 <了.
yhcelebrite 2012-04-23
  • 打赏
  • 举报
回复
如果是set 要求其按两个关键值(int a[i][j])i相比较 j相比较)谓词怎么实现?

即set<class T,predicate> 这个谓词predicate该怎么写?










evencoming 2012-04-23
  • 打赏
  • 举报
回复
封装多个key,自己实现比较函数.
struct Key
{
KEY1
KEY2
...
bool operator<(const Key&);
};;...

64,683

社区成员

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

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