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

    宝剑锋从磨砺出 梅花香自苦寒来
  • 相关阅读:
    949. Largest Time for Given Digits
    450. Delete Node in a BST
    983. Minimum Cost For Tickets
    16. 3Sum Closest java solutions
    73. Set Matrix Zeroes java solutions
    347. Top K Frequent Elements java solutions
    215. Kth Largest Element in an Array java solutions
    75. Sort Colors java solutions
    38. Count and Say java solutions
    371. Sum of Two Integers java solutions
  • 原文地址:https://www.cnblogs.com/GHzcx/p/8663243.html
Copyright © 2011-2022 走看看