您的位置:首页 > 其它

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

2017-03-10 21:05 344 查看
STL中常用的vector,map,set 用法

 

C++的标准模板库(Standard Template Library,简称STL)是一个容器和算法的类库。容器往往包含同一类型的数据。STL中比较常用的容器是vector,set和map,比较常用的算法有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);  // 这里声明的是一个已经存放了100个0的整数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 的数据的存入和输出:

[cpp] view
plain copy

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的指针

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

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

 

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性

map内部的实现自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能。

下面举例说明什么是一对一的数据映射。比如一个班级中,每个学生的学号跟他的姓名就存在着一一映射的关系,这个模型用map可能轻易描述,

很明显学号用int描述,姓名用字符串描述(本篇文章中不用char *来描述字符串,而是采用STL中string来描述),

下面给出map描述代码:

1.声明方式:

           map<int, string> mapStudent; 或map<string,int> 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.数据的遍历

第一种:应用前向迭代器
           

[cpp] view
plain copy

1.map<int, string>::iterator iter;    

2.for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)    

3.    cout<<iter->first<<"  "<<iter->second<<end;    

第二种:应用反向迭代器

[cpp] view
plain copy

1.map<int, string>::reverse_iterator iter;    

2.for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)    

3.    cout<<iter->first<<"  "<<iter->second<<end;    

第三种:用数组方式

[cpp] view
plain copy

1.int nsize = mapStudent.size()    

2.for(int nIndex = 1; nIndex <= nSize; nIndex++)    

3.     cout<<mapStudent[nIndex]<<end;    

例如:

[cpp] view
plain copy

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函数返回的迭代器。

 

例如:

[cpp] view
plain copy

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的遍历

代码如下:

[cpp] view
plain copy

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的查找

[cpp] view
plain copy

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.}    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: