在multimap和multiset中查找元素

来源:互联网 发布:js 获取get url参数 编辑:程序博客网 时间:2024/05/21 17:34

与map和set中查找元素不同的是,multimap和multiset查找元素要复杂的多;

由于multimap和multiset中,允许元素重复,所以使用find()函数查找的时候,并不只有一个元素,并

不能直接使用find();

方案一:

由于在multimap和multiset中,具有相同关键字的元素在容器中会相邻存储
可以使用find()+count()结合:

find()找到第一个查找到的元素

count()控制读取的数目

具体代码如下:

#include <iostream>#include<set>#include<string>#include<map>#include<unordered_map>using namespace std;int main(){    multimap<string,int> m={{"s",1},{"s",1},{"s",3},{"s",4},{"sb",5}};    string str="s";    int num=m.count(str);    multimap<string,int>::iterator it=m.find(str);    while(num>0)    {        cout<<it->first<<" "<<it->second<<endl;        ++it;        num--;    }    return 0;}

方案二:

使用两个迭代器:
lower_bound : 元素如果在容器中,指向第一个具有给定关键字的元素
upper_bound :元素如果在容器中,指向最后一个具有给定关键字的元素之后的位置

如果不在容器中,他们会指向一个不影响排序的关键字插入位置;

代码如下:

#include <iostream>#include<set>#include<string>#include<map>#include<unordered_map>using namespace std;int main(){    multimap<string,int> m={{"s",1},{"s",1},{"s",3},{"s",4},{"sb",5}};    string str="s";    multimap<string,int>::iterator s_begin=m.lower_bound(str);//指向第一个具有给定关键字的元素    multimap<string,int>::iterator s_end=m.upper_bound(str);  //指向最后一个具有给定关键字元素之后的位置    while(s_begin != s_end)    {        cout<<s_begin->first<<" "<<s_begin->second<<endl;        ++s_begin;    }  /*  for( unordered_map< string,int >::const_iterator  it=m.cbegin(); it != m.cend(); ++it)    {        cout<<it->first<<" "<<it->second<<endl;    }*/    return 0;}

可以看出,lower_bound和upper_bound表示了一个具有该关键字元素的范围;在这个范围内,所有元素都是我们要查找的元素;
此时,只需要判断两个迭代器是否相等作为终止条件即可;即s_begin != s_end

方案三:

使用equal_range(),这种方法最简单;

此函数接收一个关键字,返回一个pair类型,里面存放着两个迭代器,但是它本身不是迭代器;
如果关键字存在,则pair的第一个迭代器指向第一个与关键字匹配的元素;
第二个迭代器指向最后一个指向与关键字匹配的元素之后的位置。
代码如下:

#include <iostream>#include<set>#include<string>#include<map>#include<unordered_map>using namespace std;int main(){    multimap<string,int> m={{"s",1},{"s",1},{"s",3},{"s",4},{"sb",5}};    string str="s";    auto pos=m.equal_range(str);    while( pos.first != pos.second )//pos.first是第一个元素的迭代器,pos.second是最后一个元素之后位置的迭代器    {        cout<<pos.first->first<<" "<<pos.first->second<<endl;        ++pos.first;    }    return 0;}
原创粉丝点击