概念
map函数:
map函数用键值对的方式来存储数据,提供的是一种一对一的关系,这样在某些情况下提供了很好的便利。
map函数的头文件是#include<map>,实例化一个map对象:map<int ,string>,而且在修改操作中,只能改变string的值,不能更改int索引值。map函数并不是数组,所以如果要遍历的时候,就要使用迭代(iterator)才能实现遍历操作
set函数:
set函数和map函数很类似,set存储的是实值,而map函数存储的是键值对,但它们都是封装二叉树(红黑树),vector封装的是数组,list封装的是链表
内置函数的使用
增(insert函数)
map函数
添加数据主要有两个方式:
- 使用类似数组的方式:例如 emap[1]="abc";
- 使用insert函数
- map.insert(pair<int ,string>(1,"abc"));
- map.insert(map<int ,string>::value_type(1,"abc"))
实际使用的代码就不给了,只要添加头文件,添加数据后,使用迭代的方式输出即可;
set函数:
insert不会使iterator失效,不像vector那样,当增加得多时,会申请一个更大空间,使用复制来存储原来数据,这样就可能导致iterator失效。
查(find函数)
查询操作要给定索引值key来找到索引值为key的键值对,当寻找的返回值等于emap的end()时,证明没有找到。
实现代码:
#include <map>
#include <iostream>
using namespace std;
int main( )
{
map <int, int> m1, m2, m3;
map <int, int>::iterator m1_Iter;
m1.insert ( pair <int, int> ( 1, 10 ) );
m1.insert ( pair <int, int> ( 3, 30 ) );
m2.insert ( pair <int, int> ( 10, 100 ) );
m2.insert ( pair <int, int> ( 20, 200 ) );
m3.insert ( pair <int, int> ( 30, 300 ) );
map<int,int>::iterator find= m1.find(3);
cout<<find->second<<endl;
map<int,int>::iterator find1= m1.find(10);
if(find1==m1.end()) {
cout<<"Not Found"<<endl;
} else {
cout<<"can Find"<<endl;
}
}
删(erase函数)
删除的操作有三种方式:
- erase(iterator iter):删除指定的对象
- erase(iterator begin,iterator end):删除一个范围的对象
- clear() == erase(iterator map.begin(), map.end()) :删除所有的对象
代码:
#include <map>
#include <iostream>
using namespace std;
int main( )
{
map <int, int> m1, m2, m3;
map <int, int>::iterator m1_Iter;
m1.insert ( pair <int, int> ( 1, 10 ) );
m1.insert ( pair <int, int> ( 2, 20 ) );
m1.insert ( pair <int, int> ( 3, 30 ) );
m1.insert ( pair <int, int> ( 4, 40 ) );
m1.insert ( pair <int, int> ( 5, 50 ) );
m2.insert ( pair <int, int> ( 10, 100 ) );
m2.insert ( pair <int, int> ( 20, 200 ) );
m3.insert ( pair <int, int> ( 30, 300 ) );
map<int,int>::iterator find1= m1.find(2);
map<int,int>::iterator find2= m1.find(4);
m1.erase(find); //方法1
m1.clear(); //方法3相当于erase(m1.begin(),m1.end());
m1.erase(find1,find2); //方法2
for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
cout << " " << m1_Iter -> second;
cout << "." << endl;
}
交换两个容器(swap函数)
在swap函数中,和int的swap操作差不多,只是map的swap不是交换数据,而是把两个容器交换。
简单的实现的代码:
#include <map>
#include <iostream>
using namespace std;
int main( )
{
map <int, int> m1, m2, m3;
map <int, int>::iterator m1_Iter;
m1.insert ( pair <int, int> ( 1, 10 ) );
m1.insert ( pair <int, int> ( 2, 20 ) );
m1.insert ( pair <int, int> ( 3, 30 ) );
m1.insert ( pair <int, int> ( 4, 40 ) );
m1.insert ( pair <int, int> ( 5, 50 ) );
m2.insert ( pair <int, int> ( 10, 100 ) );
m2.insert ( pair <int, int> ( 20, 200 ) );
m3.insert ( pair <int, int> ( 30, 300 ) );
swap(m1,m2);
for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
cout << " " << m1_Iter -> second;
cout << "." << endl;
}
排序的问题
排序的话,原函数在你存储数据的时候就会帮你以索引值升序的排序方式给你排列好,不管你输入的顺序是什么,map函数和set函数都是如此
rbegin和rend函数
rbegin和rend使用的是反向迭代器,反向迭代器也是有很多知识点的,这里需要注意的是,反向迭代器的定义和反向迭代自增和自减操作。
简单的实现代码:
#include <map>
#include <iostream>
using namespace std;
int main( )
{
map <int, int> m1, m2, m3;
map <int, int>::reverse_iterator m1_Iter; //反向迭代器的定义
m1.insert ( pair <int, int> ( 1, 10 ) );
m1.insert ( pair <int, int> ( 2, 20 ) );
m1.insert ( pair <int, int> ( 3, 30 ) );
m1.insert ( pair <int, int> ( 4, 40 ) );
m1.insert ( pair <int, int> ( 5, 50 ) );
m2.insert ( pair <int, int> ( 10, 100 ) );
m2.insert ( pair <int, int> ( 20, 200 ) );
m3.insert ( pair <int, int> ( 30, 300 ) );
swap(m1,m2);
for ( m1_Iter = m1.rbegin( ); m1_Iter != m1.rend( ); m1_Iter++) //反向迭代器的自增是向前操作
cout << " " << m1_Iter -> second;
cout << "." << endl;
}
upper_bound和lower_bound函数
upper_bound函数是用来返回大于key的第一个键值,lower_bound就是返回大于或等于key的第一个键值。
实现代码:
#include <map>
#include <iostream>
using namespace std;
int main( )
{
map <int, int> m1, m2, m3;
map <int, int>::iterator m1_Iter,lower;
m1.insert ( pair <int, int> ( 1, 10 ) );
m1.insert ( pair <int, int> ( 2, 20 ) );
m1.insert ( pair <int, int> ( 3, 30 ) );
m1.insert ( pair <int, int> ( 4, 40 ) );
m1.insert ( pair <int, int> ( 5, 50 ) );
m2.insert ( pair <int, int> ( 10, 100 ) );
m2.insert ( pair <int, int> ( 20, 200 ) );
m3.insert ( pair <int, int> ( 30, 300 ) );
m1_Iter=m1.upper_bound(3);
lower=m1.lower_bound(3);
cout<<m1_Iter->second<<endl;
cout<<lower->second<<endl;
}