zoukankan      html  css  js  c++  java
  • STL模板整理 vector

    一、什么是标准模板库(STL)?

    1、C++标准模板库与C++标准库的关系

    C++标准模板库其实属于C++标准库的一部分,C++标准模板库主要是定义了标准模板的定义与声明,而这些模板主要都是

    类模板,我们可以调用这些模板来定义一个具体的类;与之前的自己手动创建一个函数模版或者是类模板不一样,我们使用了

    STL就不用自己来创建模板了,这些模板都定义在标准模板库中,我们只需要学会怎么使用这些类模板来定义一个具体的类,

    然后能够使用类提供的各种方法来处理数据。

    2、STL六大组件:容器(containers)、算法(algorithms)、迭代器(iterators)、函数对象(functors)、适配器(adapters)、分配器(allocators)

    二、迭代器

    迭代器是一种对象,它能够用来遍历STL容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址,所以可以认为迭代器其实就是用来指向容器中数

    据的指针,我们可以通过改变这个指针来遍历容器中的所有元素。

    三、容器

    首先,我们必须理解一下什么是容器,对比我们生活当中的容器,例如水杯、桶、水瓶等等这些东西,其实他们都是容器,他们的一个共同点就是:都是用来

    存放液体的,能够用来存放一些东西;其实在我们的C++中说的这个容器其实作用也是用来存放"东西",但是存放的是数据,在C++中容器就是一种用来存放

    数据的对象。

    1、C++中的容器其实是容器类实例化之后的一个具体的对象,那么可以办这个对象看成就是一个容器。

    2、因为C++中容器类是基于类模板定义的,也就是我们这里说的STL(标准模板类)。为什么需要做成模板的形式呢?因为我们的容器中存放的数据类型其实

    是相同的,如果就因为数据类型不同而要定义多个具体的类,这样就不合适,而模板恰好又能够解决这种问题,所以C++中的容器类是通过类模板的方式定义的

    ,也就是STL。

    3、容器还有另一个特点是容器可以自行扩展。在解决问题时我们常常不知道我们需要存储多少个对象,也就是说我们不知道应该创建多大的内存空间来存放我们

    的数据。显然,数组在这一方面也力不从心。容器的优势就在这里,它不需要你预先告诉它你要存储多少对象,只要你创建一个容器对象,并合理的调用它所提

    供的方法,所有的处理细节将由容器来自身完成。它可以为你申请内存或释放内存,并且用最优的算法来执行您的命令。

    4、容器是随着面向对象语言的诞生而提出的,容器类在面向对象语言中特别重要,甚至它被认为是早期面向对象语言的基础。

    四、容器的分类

     

    STL对定义的通用容器分三类:顺序性容器关联式容器容器适配器

    我想说的是对于上面的每种类型的容器到底是是什么意思,其实没必要去搞懂,没什么价值,只要你能够大概理解知道即可,知道每种容器类型下有哪些具体的容器

    即可。

    顺序性容器:vector、deque、list

    关联性容器:set、multiset、map、multimap

    容器适配器:stack、queue、

    vector 向量:

    vector向量是一种顺序行容器。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。

    用法:

    #include <algorithm>
    #include <bitset>
    #include <cmath>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <deque>
    #include <iomanip>
    #include <iostream>
    #include <map>
    #include <queue>
    #include <set>
    #include <stack>
    #include <vector>
    using namespace std;
    #define is_lower(c) (c >= 'a' && c <= 'z')
    #define is_upper(c) (c >= 'A' && c <= 'Z')
    #define is_alpha(c) (is_lower(c) || is_upper(c))
    #define is_digit(c) (c >= '0' && c <= '9')
    #define min(a, b) ((a) < (b) ? (a) : (b))
    #define max(a, b) ((a) > (b) ? (a) : (b))
    #define IO                 
      ios::sync_with_stdio(0); 
      cin.tie(0);              
      cout.tie(0);
    #define For(i, a, b) for (int i = a; i <= b; i++)
    typedef long long ll;
    typedef unsigned long long ull;
    typedef int T;
    const ll inf = 0x3f3f3f3f;
    const double EPS = 1e-10;
    const ll inf_ll = (ll)1e18;
    const ll mod = 1000000007LL;
    const int maxn = 1000000;
    int main() {
        vector<T> v1;
        vector<T> v2(v1);    // v2是v1的一个副本
        vector<T> v3(5, 1);  //(n,i)v3包含了n个数值为i的元素
        vector<T> v4(5);     // v4包含了n个元素,每个元素的值都为0
        /*
        vector常用函数
    
        empty():判断向量是否为空,为空返回真,否则为假
    
        begin():返回向量(数组)的首元素地址
    
        end(): 返回向量(数组)的末元素的下一个元素的地址
    
        clear():清空向量
    
        front():返回得到向量的第一个元素的数据
    
        back():返回得到向量的最后一个元素的数据
    
        size():返回得到向量中元素的个数
    
        erase(pos): 删除pos位置的数据
        
        erase(begin,end): 删除[begin,end)区间的数据
    
        insert(pos,data): 在pos位置插入数据
    
        push_back(数据):将数据插入到向量的尾部
        
        pop_back():删除向量尾部的数据
        */
        /*
        遍历方式:
        vector向量支持两种方式,因为可以认为vector是一种动态数组,所以可以使用数组下标的方式,也可以使用迭代器
        */
        for(int i = 1; i < 5; i++)
            v1.push_back(i); // 将1、2、3、4顺序加入数组
        cout << "size of v1: " << v1.size() << "  sizeof(v1):" << sizeof(v1) << endl;
        //按下标方式遍历vector
        for(int i = 0; i < v1.size(); i++)
            cout << v1[i] << " ";
        cout << endl;
        //按迭代器方式遍历
        vector <T> :: iterator itor  = v1.begin();
        for( ; itor != v1.end(); itor++)
            cout << *itor << " ";
        cout <<endl;
        itor = v3.begin();
        cout << "v3: ";
        for( ; itor != v3.end(); itor++)
            cout << *itor ;
        cout << endl;
        return 0;
    }  

    宝剑锋从磨砺出 梅花香自苦寒来
  • 相关阅读:
    批量下载文件方法
    批量下载文件技术
    批量下载文件插件
    Java实现 LeetCode 539 最小时间差(单位转换)
    Java实现 LeetCode 535 TinyURL 的加密与解密(位运算加密)
    2018-8-10-git-提交添加-emoij-文字
    2018-8-10-git-提交添加-emoij-文字
    2018-8-10-win10-uwp-使用-Geometry-resources-在-xaml
    【树莓派】树莓派4无痛安装系统(NOOBS篇)
    SSH流量转发的姿势
  • 原文地址:https://www.cnblogs.com/GHzcx/p/8663243.html
Copyright © 2011-2022 走看看