C++ map使用(基于RBTree)

一、insert

◦1)用insert函数插入pair数据

◦map<int, string> mapStudent;

◦mapStudent.insert(pair<int, string>(1, “student_one”));

◦2)用insert函数插入value_type数据

◦map<int, string> mapStudent;

◦mapStudent.insert(map<int, string>::value_type (1, “student_one”));

◦3)用数组方式插入数据

◦map<int, string> mapStudent;

◦mapStudent[1]=“student1”;

◦mapStudent[2]=“student2”;

前两种如果插入相同的key,则插入失败,但是不会报错,例如

map<int,int> ss;
ss.insert(make_pair(1,1));
ss.insert(make_pair(1,2));

两次插入之后,ss[1]仍然为1.那么我们怎么知道是否插入成功了呢?

可以用pair来获得是否插入成功。
◦pair<map<int, string>::iterator, bool> Insert_Pair;
◦Insert_Pair = mapStudent.insert(map<int, string>::value_type (1, “student_one”));
◦我们通过pair的第二个变量来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功的话Insert_Pair.second应该是true的,否则为false。

但是第三种会覆盖原先的值

map<int,int> ss;
ss[1]=1;
ss[1]=2;

两次插入之后,ss[1]wei 2.

 

二、根据key读map:

首先读取map最直观的方式是map[key],但是这样面临一个问题,可能这个key在map中根本不存在,因此在读取之前需要判断是否存在。

两种方式可以判断是否存在。

int num=map.count(key)

num=0: 不存在

num=1:存在

另一种是使用

map<type,type>::iterator iter;

iter=map.find(key);

if(iter!=map.end()){

  iter->second;//get data

}

 

三、遍历所有数据

map本身是红黑树,所以数据是有顺序的,可以使用两种顺序呢遍历,实际上就是树的中序遍历。

升序遍历是首先访问左子结点,降序遍历首先访问右子节点。

map<int,int> ss;

    ss.insert(make_pair(1,1));

    ss.insert(make_pair(5,5));

    ss.insert(make_pair(10,10));

    ss.insert(make_pair(6,6));

    ss.insert(make_pair(4,2));

    map<int,int>::iterator iter1;

    for(iter1=ss.begin();iter1!=ss.end();iter1++){

        cout<<iter1->first<<" "<<iter1->second<<endl;

    }

    cout<<endl;

    map<int,int>::reverse_iterator iter2;

    for(iter2=ss.rbegin();iter2!=ss.rend();iter2++){

        cout<<iter2->first<<" "<<iter2->second<<endl;

    }

    cout<<endl;

结果为

 四、数据的清空与判空

 清空map中的数据可以用clear()函数,判定map中是否有数据可以用empty()函数,它返回true则说明是空map

 

 五、数据的删除

 这里要用到erase函数,它有三个重载了的函数,下面在例子中详细说明它们的用法

◦      1)如果要删除1, 用迭代器删除

◦       map<int, string>::iterator iter;

◦       iter = mapStudent.find(1);

◦       mapStudent.erase(iter);

◦       2)如果要删除1,用关键字删除

◦       Int n = mapStudent.erase(1);//如果删除了会返回1,否则返回0

◦       3)用迭代器,成片的删除

◦       //一下代码把整个map清空

◦       mapStudent.earse(mapStudent.begin(), mapStudent.end());

◦       //成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合

引用:

http://www.cnblogs.com/nzbbody/p/3409298.html

http://www.cnblogs.com/mattins/p/3531362.html

你可能感兴趣的:(tree)