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

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 的数据的存入和输出:

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.数据的遍历

第一种:应用前向迭代器

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.}  

时间: 2024-08-25 18:04:34

STL中常用的vector,map,set 用法的相关文章

STL中常用数据结构

STL中常用的数据结构: [1]  stl中stack.queue默认的底层实现为deque结构. [2]  deque:用map管理多个size大小的连续内存块,方便头尾插入. [3]  vector:变长动态数组,每次增大1.5倍,删除元素时不释放空间. [4]  priority_queue底层默认采用vector向量O(nlogn). [5]  list:双向链表容器. [6]  slist:单向链表容器. [7]  bit_vector:一个bit位元素的序列容器,常用于硬件端口的控制

PHP中常用数组的一些基本用法

PHP中常用数组的一些基本用法和操作: 索引数组$arr=array("aa","ss","dd","ff");echo $arr[0].', '.$arr[1].' ,' .$arr[2].' ,' .$arr[3]; 获取数组的长度echo count($arr); 遍历索引数组for($i=0;$i<count($arr);$i++){ echo $arr[$i]; echo "\n";} fo

STL中常用的c++语法

函数调用操作(c++语法中的左右小括号)可以被重载,STL的特殊版本都以仿函数形式呈现.如果对某个class进行operator()重载,它就成为一个仿函数. #include <iostream> using namespace std; template<class T> struct Plus { T operator()(const T& x, const T& y)const { return x + y; } }; template<class T

C++STL中的向量vector

#include<iostream>#include<vector>#include<algorithm>using namespace std;typedef vector<int> vt;int main(){ int i; vt v1(10); //定义向量10个元素,注意每个元素初始化为了0 for (i = 0; i < 10; i++)  cout << v1[i] << " "; cout &l

android中常用的读取文件的用法如下

1. 从resource的raw中读取文件数据: String res = ""; try{ //得到资源中的Raw数据流 InputStream in = getResources().openRawResource(R.raw.test); //得到数据的大小 int length = in.available(); byte [] buffer = new byte[length]; //读取数据 in.read(buffer); //依test.txt的编码类型选择合适的编码,

java中常用的数据结构--Map

一.定义: 将键映射到值的对象. 地图不能包含重复的键; 每个键可以映射到最多一个值. public interface Map<K,V> 请注意!!!, Map 没有继承 Collection 接口, Map 提供 key 到 value 的映射,你可以通过“键”查找“值”.一个 Map 中不能包含相同的 key ,每个 key 只能映射一个 value . Map 接口提供 3 种集合的视图, Map 的内容可以被当作一组 key 集合,一组 value 集合,或者一组 key-value

stl中常用的排序算法

#include"iostream" #include"vector" using namespace std; #include"string" #include"algorithm" void main_mergr() { vector<int > v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); vector<int > v2; v2.p

STL中的Vector相关用法

STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int>是一种数据类型. Vector的存储空间是连续的,list不是连续存储的. 1. 定义和初始化 vector< typeName > v1; //默认v1为空,故下面的赋值是错误的v1[0]=5;//v2是v1的一个副本,若v1.size()>v2.size()则赋值后v2.size()被

STL中map的用法

map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道.这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处. 下面举例说明什么是一对一的数据映射.比如一个班级中,每个学生的学号跟他的姓名就存在着一一