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

    xiaoxiao2021-03-25  83

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

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

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

    第一种:应用前向迭代器            

    [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.}    
    转载请注明原文地址: https://ju.6miu.com/read-24819.html

    最新回复(0)