欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【数据结构】map 和 set 增、删、查、改的使用

程序员文章站 2022-03-22 19:17:02
...

map:

map 是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字K,每个关键字只能在map中出现一次,第二个可能称为该关键字的值V)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。

map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。

1 头文件

#include < map >

2 定义

map< string,   int>   my_Map; //第一个string是key,也可是char等数据类型,第二个值是value,也可为其他数据类型

或者是

 typedef     map<string,int>   MY_MAP ; 
  MY_MAP     my_Map; 

3 迭代器:

 map<string,int>::iterator map_it; //从声明可以看出返回pair类型,有两个值,first代表const(只读)的关键字key,second代表value

 map_it=my_Map.begin();//指向首

4 插入数据

    my_Map["a"]   =   1; //下标操作其实是map遍历的方法,因为下标遍历时候key不存在就插入,存在不做操作,++my_Map["a"]存在不存在都将其值                                                                                                                                                                                                   +1
 my_Map.insert(map<string,int>::value_type("b",2));  
 my_Map.insert({"b",2});
 my_Map.insert(pair<string,int>("c",3));
 my_Map.insert(make_pair<string,int>("d",4)); 

5 查找数据和修改数据

 int i = my_Map["a"]; 
 my_Map["a"] = i; 
   MY_MAP::iterator   my_Itr; 
            my_Itr.find("b"); 
            int j = my_Itr->second; 
            my_Itr->second = j; 

不过注意,键本身是不能被修改的,除非删除。

6 删除数据

     my_Map.erase(my_Itr);//错误,不能这样使用 
     my_Map.erase("c"); 

还是注意,第一种情况在迭代期间是不能被删除的,道理和foreach时不能删除元素一样。

7 迭代数据

 for  (my_Itr=my_Map.begin();   my_Itr!=my_Map.end();   ++my_Itr)   {} 

8 其它方法
my_Map.size() 返回元素数目
my_Map.empty() 判断是否为空
my_Map.clear() 清空所有元素
可以直接进行赋值和比较:=, >, >=, <, <=, != 等等

深入了解map,multimap

map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值。


set

1 头文件

#include < set>

2 定义

set<string>   my_set; //string是关键字,类似map中的第一个,也可是char等数据类型

3 迭代器:

 set<string>::iterator set_it;//从声明可以看出指向关键字
 set_it=my_set.begin();//指向首

4 插入数据

(1) 不可用下标方法插入遍历
(2)

my_set.insert({‘a’}); //insert返回一个pair类型,第一个是一个迭代器指向元素,第二个是一个bool值,插入成功返回true,已经存在返回false

(3)

vector<int> vec={2,4,6,8,10};
my_set.insert(vec.begin(),vec.end()); 

(4)

    my_set.insert({1,2,3,4,5,6,7}); 

5 查找数据和修改数据

  set<char>::iterator my_Itr=my_set.begin(); 
            *my_Itr;//元素

          my_set.find('a');//返回迭代器,指向key=='a'的元素,若没有此元素返回my_set.end();

          my_set.count('a');//返回关键字等于'a'的数量,对已set不允许重复关键字,返回值永远是0或1

不过注意,键本身是不能被修改的,除非删除。

6 删除数据

    my_set.erase(my_Itr); 
    my_set.erase("c"); 

还是注意,第一种情况在迭代期间是不能被删除的,道理和foreach时不能删除元素一样。

7 迭代数据

for   (my_Itr=my_Map.begin();my_Itr!=my_Map.end();++my_Itr)  
 {} 

8 其它方法
my_set.size() 返回元素数目
my_set.empty() 判断是否为空
my_set.clear() 清空所有元素
可以直接进行赋值和比较:=, >, >=, <, <=, != 等等