1.multimap,multiset相应的头文件分别是map和set头文件
*multimap,multiset类型允许一个键对应多个实例
*multimap,multiset所支持的操作分别和map,set相同,但不支持下标操作符
2.添加元素insert()
*由于键不要求唯一的,因此每次调用insert总会添加一个元素
3.删除元素erase()
*带有一个键参数的erase版本将会删除拥有该键的所有元素,并返回删除元素的个数
*带有一个或一对迭代器参数的版本只删除指定的元素,并返回void类型
原型:
void erase (iterator position);
size_type erase (const key_type& k);
void erase (iterator first, iterator last);
4.在multimap和multiset中查找元素:find(),count(),lower_bound(),upper_bound(),equal_range()
*关联容器map,set,multimap,multiset的元素是按顺序存储的
*在multimap,multiset容器中,如果某个键对应多个实例,则这些实例在容器中将相邻存放
以multimap为例
原型:
iterator find (const key_type& k);
const_iterator find (const key_type& k) const;
size_type count (const key_type& k) const;
Examples 2-3:
int main ()
{
multimap<char,int> mymultimap;
// insert some values:
mymultimap.insert(std::pair<char,int>('a',10));
mymultimap.insert(std::pair<char,int>('b',20));
mymultimap.insert(std::pair<char,int>('b',30));
mymultimap.insert(std::pair<char,int>('c',40));
mymultimap.insert(std::pair<char,int>('d',50));
mymultimap.insert(std::pair<char,int>('d',60));
mymultimap.insert(std::pair<char,int>('e',70));
mymultimap.insert(std::pair<char,int>('f',80));
multimap<char,int>::iterator it = mymultimap.find('b');
mymultimap.erase (it); // erasing by iterator (1 element)
mymultimap.erase ('d'); // erasing by key (2 elements)
it=mymultimap.find ('e');
mymultimap.erase ( it, mymultimap.end() ); // erasing by range
// show content:
for (it=mymultimap.begin(); it!=mymultimap.end(); ++it)
cout << (*it).first << " => " << (*it).second << '\n';
return 0;
}
输出:
a =>10
b =>30
c =>40
*查找相同键的所有元素
法一:根据如果某个键对应多个实例,则这些实例在容器中将相邻存放
Examples:
int main(void)
{
multimap<char,int> mymm;
mymm.insert (pair<char,int>('x',10));
mymm.insert (pair<char,int>('x',20));
mymm.insert (pair<char,int>('x',30));
multimap<char,int>::size_type entries,cnt;
entries=mymm.count('x');
multimap<char,int>::iterator it =mymm.find('x');
for(cnt=0;cnt!=entries;++cnt,++it)
{
cout<<it->second<<'\t'; //10 20 30
}
return 0;
}
法二:lower_bound(),upper_bound(),equal_range():
const_iterator lower_bound (const key_type& k) const;
iterator upper_bound (const key_type& k);
const_iterator upper_bound (const key_type& k) const;
pair<const_iterator,const_iterator> equal_range (const key_type& k) const;
pair<iterator,iterator> equal_range (const key_type& k);
Examples:根据在同一个键上调用lower_bound,upper_bound,将产生一个迭代器的范围,指示出该键所关联的所有元素
int main(void)
{
multimap<char,int> mymm;
mymm.insert (pair<char,int>('x',10));
mymm.insert (pair<char,int>('x',20));
mymm.insert (pair<char,int>('x',30));
multimap<char,int>::iterator beg =mymm.lower_bound('x');
multimap<char,int>::iterator end =mymm.upper_bound('x');
for(;beg!=end;++beg)
{
cout<<beg->second<<'\t'; //10 20 30
}
return 0;
}
Examples:根据equal_range()返回一个迭代器的pair对象
int main(void)
{
multimap<char,int> mymm;
mymm.insert (pair<char,int>('x',10));
mymm.insert (pair<char,int>('x',20));
mymm.insert (pair<char,int>('x',30));
typedef multimap<char,int>::iterator myit;
pair<myit,myit> pos = mymm.equal_range('x');
for(;pos.first!=pos.second;++pos.first)
{
cout<<pos.first->second<<'\t'; //10 20 30
}
return 0;
}
*multimap,multiset类型允许一个键对应多个实例
*multimap,multiset所支持的操作分别和map,set相同,但不支持下标操作符
2.添加元素insert()
*由于键不要求唯一的,因此每次调用insert总会添加一个元素
3.删除元素erase()
*带有一个键参数的erase版本将会删除拥有该键的所有元素,并返回删除元素的个数
*带有一个或一对迭代器参数的版本只删除指定的元素,并返回void类型
原型:
void erase (iterator position);
size_type erase (const key_type& k);
void erase (iterator first, iterator last);
4.在multimap和multiset中查找元素:find(),count(),lower_bound(),upper_bound(),equal_range()
*关联容器map,set,multimap,multiset的元素是按顺序存储的
*在multimap,multiset容器中,如果某个键对应多个实例,则这些实例在容器中将相邻存放
以multimap为例
原型:
iterator find (const key_type& k);
const_iterator find (const key_type& k) const;
size_type count (const key_type& k) const;
Examples 2-3:
int main ()
{
multimap<char,int> mymultimap;
// insert some values:
mymultimap.insert(std::pair<char,int>('a',10));
mymultimap.insert(std::pair<char,int>('b',20));
mymultimap.insert(std::pair<char,int>('b',30));
mymultimap.insert(std::pair<char,int>('c',40));
mymultimap.insert(std::pair<char,int>('d',50));
mymultimap.insert(std::pair<char,int>('d',60));
mymultimap.insert(std::pair<char,int>('e',70));
mymultimap.insert(std::pair<char,int>('f',80));
multimap<char,int>::iterator it = mymultimap.find('b');
mymultimap.erase (it); // erasing by iterator (1 element)
mymultimap.erase ('d'); // erasing by key (2 elements)
it=mymultimap.find ('e');
mymultimap.erase ( it, mymultimap.end() ); // erasing by range
// show content:
for (it=mymultimap.begin(); it!=mymultimap.end(); ++it)
cout << (*it).first << " => " << (*it).second << '\n';
return 0;
}
输出:
a =>10
b =>30
c =>40
*查找相同键的所有元素
法一:根据如果某个键对应多个实例,则这些实例在容器中将相邻存放
Examples:
int main(void)
{
multimap<char,int> mymm;
mymm.insert (pair<char,int>('x',10));
mymm.insert (pair<char,int>('x',20));
mymm.insert (pair<char,int>('x',30));
multimap<char,int>::size_type entries,cnt;
entries=mymm.count('x');
multimap<char,int>::iterator it =mymm.find('x');
for(cnt=0;cnt!=entries;++cnt,++it)
{
cout<<it->second<<'\t'; //10 20 30
}
return 0;
}
法二:lower_bound(),upper_bound(),equal_range():
以multimap为例:
原型:
iterator lower_bound (const key_type& k);const_iterator lower_bound (const key_type& k) const;
iterator upper_bound (const key_type& k);
const_iterator upper_bound (const key_type& k) const;
pair<const_iterator,const_iterator> equal_range (const key_type& k) const;
pair<iterator,iterator> equal_range (const key_type& k);
Examples:根据在同一个键上调用lower_bound,upper_bound,将产生一个迭代器的范围,指示出该键所关联的所有元素
int main(void)
{
multimap<char,int> mymm;
mymm.insert (pair<char,int>('x',10));
mymm.insert (pair<char,int>('x',20));
mymm.insert (pair<char,int>('x',30));
multimap<char,int>::iterator beg =mymm.lower_bound('x');
multimap<char,int>::iterator end =mymm.upper_bound('x');
for(;beg!=end;++beg)
{
cout<<beg->second<<'\t'; //10 20 30
}
return 0;
}
Examples:根据equal_range()返回一个迭代器的pair对象
int main(void)
{
multimap<char,int> mymm;
mymm.insert (pair<char,int>('x',10));
mymm.insert (pair<char,int>('x',20));
mymm.insert (pair<char,int>('x',30));
typedef multimap<char,int>::iterator myit;
pair<myit,myit> pos = mymm.equal_range('x');
for(;pos.first!=pos.second;++pos.first)
{
cout<<pos.first->second<<'\t'; //10 20 30
}
return 0;
}