STL中常用的vector,map,set 用法

时间:2020-12-17 15:54:20

STL中常用的vector,map,set 用法

 

C++的标准模板库(Standard Template Library,简称STL)是一个容器和算法的类库。容器往往包含同一类型的数据。STL中比较常用的容器是vectorsetmap,比较常用的算法有Sort等。
.
. vector


1.声明:
           一个vector类似于一个动态的一维数组。

           vector可以存在重复的元素!

           vector<int> a;          // 声明一个元素为int类型的vector a

           vectot<MyType> a;       // 声明一个元素为MyType类型的vector a
          这里的声明的a包含0个元素,既a.size()的值为0但它是动态的,其大小会随着数据的插入和删除改变而改变。

           vector<int> a(100, 0);  // 这里声明的是一个已经存放了1000的整数vector

2.向量操作
常用函数:
          a.size();                // 返回vector的大小,即包含的元素个数
          a.pop_back();            // 删除vector末尾的元素,vector大小相应减一
          a.push_back();           // 用于在vector的末尾添加元素
          a.back();                // 返回vector末尾的元素
          a.clear();               // 将vector清空,vector大小变为0
其他访问方式:
          cout<<a[5]<<endl;
          cout<<a.at(5)<<endl;
以上区别在于后者在访问越界时会抛出异常,而前者不会。

3.遍历

          (1).     for(vector<datatype>::iterator it=a.begin(); it!=a.end(); it++)

                     cout<<*it<<endl;

          (2).     for(int i = 0; i < a.size(); i++)

                     cout<<a[i]<<endl;

1.vector 的数据的存入和输出:

1.#include <cstdio>  
2.#include <vector>  
3.#include <iostream>  
4.using namespace std;  
5.int main()  
6.{  
7.    int i = 0;  
8.    vector<int> v;  
9.    for(i = 0; i < 10; i++)  
10.    {  
11.        v.push_back( i );       //把元素一个一个存入到vector中  
12.    }  
13.    /* v.clear()*/ //对存入的数据清空  
14.    for( i = 0; i < v.size(); i++ ) //v.size() 表示vector存入元素的个数  
15.    {  
16.        cout << v[ i ] << "  "; //把每个元素显示出来  
17.    }  
18.    cout << endl;  
19.}  

 

1. push_back()        在数组的最后添加一个数据

2. pop_back()         去掉数组的最后一个数据

3. at()               得到编号位置的数据

4. begin()            得到数组头的指针

5. end()              得到数组的最后一个单元+1的指针

6front()            得到数组头的引用

7. back()             得到数组的最后一个单元的引用

8. max_size()         得到vector最大可以是多大

9. capacity()         当前vector分配的大小

10.size()             当前使用数据的大小

11.resize()           改变当前使用数据的大小,如果它比当前使用的大,则填充默认值

12.reserve()          改变当前vecotr所分配空间的大小

13.erase()            删除指针指向的数据项

14.clear()            清空当前的vector

15.rbegin()           将vector反转后的开始指针返回(其实就是原来的end-1)

16.rend()             将vector反转构的结束指针返回(其实就是原来的begin-1)

17.empty()            判断vector是否为空

18.swap()             与另一个vector交换数据

 

. map

 

MapSTL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性
map内部的实现自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能。
下面举例说明什么是一对一的数据映射。比如一个班级中,每个学生的学号跟他的姓名就存在着一一映射的关系,这个模型用map可能轻易描述,
很明显学号用int描述,姓名用字符串描述(本篇文章中不用char *来描述字符串,而是采用STLstring来描述),
下面给出map描述代码:


1.声明方式:
           map<int, string> mapStudent; 或map<stringint> mapStudent; 

/*两者均是正确声明方式,当然效果是不一样的*/

 

2.数据的插入
在构造map容器后,我们就可以往里面插入数据了。这里讲三种插入数据的方法:
第一种:用insert函数插入pair数据
           map<int, string> mapStudent;
           mapStudent.insert(pair<int, string>(1,“student_one”));

第二种:用insert函数插入value_type数据
           map<int, string> mapStudent;
           mapStudent.insert(map<int, string>::value_type (1,“student_one”));
第三种:用数组方式插入数据

           map<int, string> mapStudent;
           mapStudent[1] = “student_one”;
           mapStudent[2] = “student_two”;

/*

如果是
#include <map>
map<string, int> mapStudent;

string s;
插入就用m[s]=1或者m[s]++之类;

*/

以上三种用法,虽然都可以实现数据的插入,但是它们是有区别的,当然了第一种和第二种在效果上是完成一样的,用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是不能再插入这个数据的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值;


3.map的大小

在往map里面插入了数据,我们怎么知道当前已经插入了多少数据呢,可以用size函数:
             int nSize = mapStudent.size();


4.数据的遍历

第一种:应用前向迭代器
           

1.map<int, string>::iterator iter;  
2.for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  
3.    cout<<iter->first<<"  "<<iter->second<<end;  

第二种:应用反向迭代器

1.map<int, string>::reverse_iterator iter;  
2.for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)  
3.    cout<<iter->first<<"  "<<iter->second<<end;  

第三种:用数组方式

1.int nsize = mapStudent.size()  
2.for(int nIndex = 1; nIndex <= nSize; nIndex++)  
3.     cout<<mapStudent[nIndex]<<end;  

例如:

1.#include<map>  
2.#include<string>  
3.#include<iostream>  
4.using namespace std;  
5.  
6.int main()  
7.{  
8.    map<string,int>  m;  
9.    m["a"]=1;  
10.    m["b"]=2;  
11.    m["c"]=3;  
12.    map<string,int>::iterator it;  
13.    for(it=m.begin();it!=m.end();++it)  
14.        cout<<"key: "<<it->first <<" value: "<<it->second<<endl;  
15.    return   0;  
16.}  
17.  
18.   
19.map<string,int>::iterator it;   定义一个迭代指针it。   
it->first 为索引键值,it->second 为值。  

5. 数据的查找(包括判定这个关键字是否在map中出现)

这里给出三种数据查找方法:
第一种:用count函数来判定关键字是否出现,但是无法定位数据出现位置
第二种:用find函数来定位数据出现位置它返回的一个迭代器,
当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。

 

例如:

1.int main()  
2.{  
3.            map<int, string> mapStudent;  
4.            mapStudent.insert(pair<int, string>(1, “student_one”));  
5.            mapStudent.insert(pair<int, string>(2, “student_two”));  
6.            mapStudent.insert(pair<int, string>(3, “student_three”));  
7.            map<int, string>::iterator iter;  
8.            iter = mapStudent.find(1);  
9.            if(iter != mapStudent.end())  
10.            {  
11.                   cout<<”Find, the value is ”<<iter->second<<endl;  
12.            }  
13.            else  
14.            {  
15.               cout<<”Do not Find”<<endl;  
16.            }  
17.}  

第三种:这个方法用来判定数据是否出现
lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)
upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)
例如:map中已经插入了1,2,3,4的话,如果lower_bound(2)的话,返回的2,而upper-bound(2)的话,返回的就是3
equal_range函数返回一个pair,pair里面第一个变量是Lower_bound返回的迭代器,pair里面第二个迭代器是Upper_bound返回的迭代器,如果这两个迭代器相等的话,则说明map中不出现这个关键字,程序说明
mapPair = mapStudent.equal_range(2);
if(mapPair.first == mapPair.second)
      
            cout<<”Do not Find”<<endl;


6. 数据的清空与判空

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


7. 数据的删除
这里要用到erase函数,它有三个重载了的函数
迭代器删除 
            iter = mapStudent.find(1);
            mapStudent.erase(iter);
用关键字删除
            int n = mapStudent.erase(1);//如果删除了会返回1,否则返回0
用迭代器,成片的删除
            一下代码把整个map清空
            mapStudent.earse(mapStudent.begin(), mapStudent.end());
            //成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合


8.其他一些函数用法

这里有swap,key_comp,value_comp,get_allocator等函数;

 


. set


set是集合,set中不会包含重复的元素,这是和vector的区别。

定义:
定义一个元素为整数的集合a,可以用 set<int> a;

1,set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。 set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同。

 

set的基本操作:
1. begin()         返回指向第一个元素的迭代器
2. clear()         清除所有元素
3. count()         返回某个值元素的个数
4. empty()         如果集合为空,返回true
5. end()           返回指向最后一个元素的迭代器
6. equal_range()   返回集合中与给定值相等的上下限的两个迭代器
7. erase()         删除集合中的元素
8. find()          返回一个指向被查找到元素的迭代器
9. get_allocator() 返回集合的分配器
10.insert()        在集合中插入元素
11.lower_bound()   返回指向大于(或等于)某值的第一个元素的迭代器
12.key_comp()      返回一个用于元素间值比较的函数
13.max_size()      返回集合能容纳的元素的最大限值
14.rbegin()        返回指向集合中最后一个元素的反向迭代器
15.rend()          返回指向集合中第一个元素的反向迭代器
16.size()          集合中元素的数目
17.swap()          交换两个集合变量
18.upper_bound()   返回大于某个值元素的迭代器
19.value_comp()    返回一个用于比较元素间的值的函数

 

set的遍历

代码如下:

1.set<int>ss;  
2.        set<int>::iterator it;  
3.        for(it = ss.begin(); it != ss.end(); it++)  
4.        {  
5.            printf("%d ",*it);  
6.        }  

set的查找

1.int main()  
2.{  
3.            set<string> setStudent;  
4.            setStudent.insert(“student_one”);  
5.            setStudent.insert(“student_two”);  
6.            setStudent.insert(“student_three”);  
7.            set<string>::iterator iter;  
8.            iter = setStudent.find(“student_one”);  
9.            if(iter != setStudent.end())  
10.            {  
11.                   cout<<”Found”<<endl;  
12.            }  
13.            else  
14.            {  
15.               cout<<”Not Found”<<endl;  
16.            }  
17.}