zoukankan      html  css  js  c++  java
  • C++ STL 初探

      学过C++的人肯定会很熟悉STL标准模板库,STL其实就是封装了一系列的接口,供我们调用很多函数或者算法的实现不需要我们从头开始写,大大提高我们的编程效率。这篇博客在简单介绍STL的情况下,会详细的来介绍vector的使用。 

        官方文档链接

      STL共有六大组件:

    一: 容器(container): 是一种数据结构,如list,vector,deque,queue等,以模板类的方法提供,为了访问容器中的数据,可以使用由容器类提供的迭代器。

    二、 迭代器(Iterator):提供了访问容器中对象的方法。

    三、算法(Algorithm):用来操作容器中的数据的模板函数。

    四、仿函数(Function object)。

    五、迭代适配器(Adapter)。

    六、控件适配器(allocator)。

      这篇博客我们先来谈谈vector。vector对应的数据结构为数组,而且是动态数组,也就是说我们不必关心该数组事先定义的容量是多少,它的大小会动态增长。与数组类似的是,我们可以在末尾进行元素的添加和删除,也可以进行元素值的随机访问和修改。 

      首先要引入头文件 #include <vector>。具体使用如下:

    (1)vector的创建:

    vector<int> vec1; // 创建一个空的vector  
    vector<int> vec2(vec1); // 创建一个vector vec2,并用vec1去初始化vec2  
    vector<int> vec3(10); // 创建一个含有n个数据的vector  
    vector<int> vec4(10,0); // 创建含有10个数据的vector,并全部初始化为0 

       构造函数进行了重载,可以用多种方式创建vector。

    (2)push_back(),pop_back()添加删除元素

    // 在vector尾部添加元素  
    vec1.push_back(4);  
    vec1.push_back(6);  
    vec1.push_back(8);  
    vec1.push_back(1);  
    vec1.push_back(2);  
    PrintVector(vec1);  
      
    // 在vector尾部删除元素  
    vec1.pop_back();  
    PrintVector(vec1);  
      
    // 在vector头部添加元素,无法完成,因为vector的数据结构为数组,无法在头部插入元素,否则需要整个数组前移;  
      
    // 在vector头部删除元素,无法完成,理由同上。  

    可以使用push_back()不断的在vector尾部添加元素,使用pop_back删除尾部元素。操作非常的方便,比我们直接用数组结构方便多了。

    (3)[],at(),取某位置的元素值

    1. // 取vector中某位置的元素值  
    2.     cout << "在1位置的元素值为:" << vec1.at(1) << endl;  
    3.     cout << "在1位置的元素值为:" << vec1[1] << endl;  

      因为vector的数据结构就是一个数组,所以可以进行随机访问。

    (4)begin(),end(),指向头元素、尾元素的指针

    void PrintVector(vector<int> ve)  
    {  
        cout << "Vector中的数据为:";  
        vector<int>::iterator veIterator;  
        for (veIterator = ve.begin(); veIterator < ve.end(); veIterator++)  
        {  
            cout << *veIterator << " ";  
        }  
        cout << endl;  
    }  

    (5)back(),front(),访问头部元素和尾部元素

    // 返回尾部数据的引用  
    cout << "尾部数据的值为:" << vec1.back() << endl;  
    // 返回头部数据的引用  
    cout << "头部数据的值为:" << vec1.front() << endl;  

    (6)max_size(),vector的最大容纳量;size():vector当前的元素个数。

    cout << "vector中的最大容量为:" << vec1.max_size() << endl;  
    cout << "vector中的元素个数为:" << vec1.size() << endl;  

    (7)empty(),判断vector是否为空

    cout << "vector是否为空:" << vec1.empty() << endl;  

    如果为空,返回1.否则返回0。

    (8)swap():交换两个vector中的值。

    (9)sort():对vector升序排序;reverse():对vector降序排序。

     (10)erase():删除某个元素

    // 删除数组的某个元素  
    // 为什么要使用iterator来进行定位,因为数组如果要删除一个元素或者插入一个元素,会导致其他元素移动,所以不能直接进行删除  
    vector<int>::iterator vItera = vec1.begin();  
    vItera = vItera + 2;  
    vec1.erase(vItera);  
    PrintVector(vec1);  

    (11)clear():清除所有元素

    // 清除所有数据  
       vec1.clear();  
       PrintVector(vec1);  
       cout << "vector是否为空:" << vec1.empty() << endl; 

    参考文章:

    http://www.cplusplus.com/reference/queue/queue/

    http://mropengate.blogspot.com/2015/07/cc-vector-stl.html

    http://blog.csdn.net/chenyufeng1991/article/details/52269300

    http://blog.csdn.net/wallwind/article/details/6858634

  • 相关阅读:
    HDU3336 Count the string —— KMP next数组
    CodeForces
    51Nod 1627 瞬间移动 —— 组合数学
    51Nod 1158 全是1的最大子矩阵 —— 预处理 + 暴力枚举 or 单调栈
    51Nod 1225 余数之和 —— 分区枚举
    51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP
    51Nod 机器人走方格 V3 —— 卡特兰数、Lucas定理
    51Nod XOR key —— 区间最大异或值 可持久化字典树
    HDU4825 Xor Sum —— Trie树
    51Nod 1515 明辨是非 —— 并查集 + 启发式合并
  • 原文地址:https://www.cnblogs.com/zhuzhenwei918/p/7434860.html
Copyright © 2011-2022 走看看