学习multimap和multiset遇到一个问题,大家帮忙看看吧,谢谢了!

Eveilei 2009-09-16 03:02:53
m.lower_bound(k) //返回一个迭代器,指向键不小于k的第一个元素
m.upper_bound(k) //返回一个迭代器,指向键大于k的第一个元素

我不了解这2个操作的意思啊,(指向键不小与k的第一个元素),什么意思啊,是比较键的大小还是比较键的值的大小啊?如果是比较键的大小,那该怎么比较啊?
如下部分代码:
typedef multimap<string,string>::iterator author_it;
author_it beg = authors.lower_bound(search_item),
end = authors.upper_bound(search_item);
while(beg !=end){
cout << beg->second <<endl;
++beg;
}

cout << beg->second <<endl;
++beg;
后面2句我也不了解意思,请仔细讲究下吧,谢谢了!

...全文
91 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
GeekWay 2012-08-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

不好意思,楼上有笔误,请看下面……

假设map <int ,double> authors里存放顺序如下
<1 , 0.0> <2 , 9.9> <3 , 1.9> <3 , 9.9> <3 , 9.0> <4 , 1.2> <12 , 5.5>

authors.lower_bound(3)指向 <3 , 1.9>
authors.upper_bound(3)指向 <4 , ……
[/Quote]

你好,我想请教一下!当字符串作为键时,怎么比较的键的大小呢?是通过键值的位置,还是通过键(字符串)啊?我写了如下代码,好像是通过‘位置’确定的,求指教,谢谢!!
<zhangsan, phone>, <zhangsan, address>, <zhangsan, email>, <lisi, phone>

multimap<string, string> authors;
string name("lisi");
authors.insert(make_pair(name, string("phone") ));//其中string()可以去掉
authors.insert(make_pair(name, string("address") ));
authors.insert(make_pair(name, string("email") ));
string name2("zhangsan");
authors.insert(make_pair(name2, string("phone") ));

typedef multimap<string , string>::iterator authors_it;
authors_it beg = authors.lower_bound(name),
end = authors.upper_bound(name);
while (beg != end)
{
cout << beg->second <<endl;
++beg;
}


输出结果:
phone
address
email
请按任意键继续. . .



mengde007 2009-09-16
  • 打赏
  • 举报
回复
当然是比较键的大小;根据键决定插入的位置;可以看看stl源码剖析;里面关于各种容器和序列的源码介绍比较清楚;
对于普通内建形式的数据,系统提供了默认的比较规则,如果是用户定义的数据类型,那么必须要自定义比较函数;一般是重载operator();
oLINo 2009-09-16
  • 打赏
  • 举报
回复
请你在MSDN里查看这两个函数,下面有例子和代码,调试一下,查看输出结果,你印象就深刻了
yshuise 2009-09-16
  • 打赏
  • 举报
回复
迭代区间,前闭后开[...... )
Eveilei 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mstlq 的回复:]
不好意思,楼上有笔误,请看下面……

假设map <int ,double> authors里存放顺序如下
<1 , 0.0> <2 , 9.9><3 , 1.9> <3 , 9.9> <3 , 9.0><4 , 1.2> <12 , 5.5>

authors.lower_bound(3)指向<3 , 1.9>
authors.upper_bound(3)指向<4 , 1.2>
[/Quote]
谢谢了啊 ,我再思考下!
yshuise 2009-09-16
  • 打赏
  • 举报
回复
m.lower_bound(k) //返回一个迭代器,指向键不小于k的第一个元素
m.upper_bound(k) //返回一个迭代器,指向键大于k的第一个元素

假如键值是下面的:
1 1 2 2 3 3 5 5

假如k = 2,m.lower_bound(2) 不小于k的第一个元素,就是大于等于2的元素,显然就是指向第一个2.
而m.upper_bound(2),是指向大于2的第一个元素,显然就是3.
所以这儿的迭代区间同begin(),end()有异曲同工之妙。

cout < < beg->second < <endl;
++beg;
这个就是对上面求出的k值区间求值了。beg->second;是vaule的值。
mstlq 2009-09-16
  • 打赏
  • 举报
回复
不好意思,楼上有笔误,请看下面……

假设map <int ,double> authors里存放顺序如下
<1 , 0.0> <2 , 9.9> <3 , 1.9> <3 , 9.9> <3 , 9.0> <4 , 1.2> <12 , 5.5>

authors.lower_bound(3)指向 <3 , 1.9>
authors.upper_bound(3)指向 <4 , 1.2>
mstlq 2009-09-16
  • 打赏
  • 举报
回复
假设map<int ,double> authors里存放顺序如下
<1 , 0.0> <2 , 9.9> <3 , 1.9> <3 , 9.9> <3 , 9.0> <4 , 1.2> <12 , 5.5>

authors.lower_bound(3)指向 <3 , 1.9>
authors.upper_bound(4)指向 <4 , 1.2>

64,654

社区成员

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

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