C++vector类

在这里插入图片描述

一、vector定义

  • 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

  • vector 是定义于名称空间 (namespace ) std 内的模板, 其定义在头文件 < vector > 中。其原型为:

    template < class T, class Allocator = allocator < T >> class vector;
    

二、容器特性

1.顺序序列

顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

2.动态数组

支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。

3.能够感知内存分配器的(Allocator-aware)

容器使用一个内存分配器对象来动态地处理它的存储需求。

三、基本成员函数

1.构造函数

  • 无参数 - 构造一个空的vector

    vector<类型>();
    
  • 数量(num)和值(val) - 构造一个初始放入num个值为val的元素的Vector

    vector<类型>( size_type num, const TYPE &val );
    
  • vector(from) - 构造一个与vector from 相同的vector

    vector<类型>( const vector &from );
    
  • 迭代器(start)和迭代器(end) - 构造一个初始值为[start,end)区间元素的Vector(注:半开区间).

    vector<类型>( input_iterator start, input_iterator end );
    

2.增加函数

  • 向量尾部增加一个元素X

    void push_back(const T& x)
  • 向量中迭代器指向元素前增加一个元素x

    iterator insert(iterator it,const T& x);
    
  • 向量中迭代器指向元素前增加n个相同的元素x

    iterator insert(iterator it,int n,const T& x);
    
  • 向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

    iterator insert(iterator it,const_iterator first,const_iterator last);
    

3.删除函数

  • 删除向量中迭代器指向元素

    iterator erase(iterator it)
  • 删除向量中[first,last)中元素

    iterator erase(iterator first,iterator last)
  • 删除向量中最后一个元素

    void pop_back()
  • 清空向量中所有元素

    void clear()

4.遍历函数

  • 返回向量头指针,指向第一个元素

    iterator begin()
  • 返回向量尾指针,指向向量最后一个元素的下一个位置

    iterator end()
  • 反向迭代器,指向最后一个元素

    reverse_iterator rbegin();
    
  • 反向迭代器,指向第一个元素之前的位置

    reverse_iterator rend();
    

5.大小和容量

  • 判断向量是否为空,若为空,则向量中无元素

    bool empty() const;
    
  • 返回向量中元素的个数

    int size() const;
    
  • 返回当前向量所能容纳的最大元素值

    int capacity() const;
    
  • 返回最大可允许的vector元素数量值

    int max_size() const;
    
  • resize() 函数改变当前vector的大小为size,且对新创建的元素赋值val

    void resize( size_type size, TYPE val );
    
  • reserve()函数为当前vector预留至少共容纳size个元素的空间.

    void reserve( size_type size );
    

6.其他函数

  • 交换两个同类型向量的数据

    void swap(vector&);
    
  • 设置向量中前n个元素的值为x

    void assign(int n,const T& x);
    
  • 向量中[first,last)中元素设置成当前向量元素

    void assign(const_iterator first,const_iterator last);
    
  • get_allocator() 函数返回当前vector的内存分配器.

    allocator_type get_allocator();
    

7.元素访问

  • c[index]的返回值是引用类型。该函数既可以取出元素, 也可以对元素赋值,但必须 确定下标是有效的。

  • 返回pos位置元素的引用

    reference at(int pos);
    
  • 返回首元素的引用

    reference front();
    
  • 返回尾元素的引用

    reference back();
    

四、vector 示例程序

  • 1.用vector实现二维数组

    #include <iostream>
    #include <vector>
    using namespace std;
    int main()
    {
        vector<vector<int>> v(3);
        //v有3个元素,每个元素都是vector<int> 容器
        for (int i = 0; i < v.size(); ++i)
            for (int j = 0; j < 4; ++j)
                v[i].push_back(j);
        for (int i = 0; i < v.size(); ++i)
        {
            for (int j = 0; j < v[i].size(); ++j)
                cout << v[i][j] << " ";
            cout << endl;
        }
        return 0;
    }
    

    程序输出结果:
    0 1 2 3
    0 1 2 3
    0 1 2 3

  • 2.vector 示例程序

    #include <iostream>
    #include <vector>
    using namespace std;
    template <class T>
    void PrintVector(T s, T e)
    {
        for (; s != e; ++s)
            cout << *s << " ";
        cout << endl;
    }
    int main()
    {
        int a[5] = {1, 2, 3, 4, 5};
        vector<int> v(a, a + 5); //将数组a的内容放入v
        cout << "1) " << v.end() - v.begin() << endl;
        //两个随机迭代器可以相减,输出 1) 5
        cout << "2) ";
        PrintVector(v.begin(), v.end());
        //2) 1 2 3 4 5
        v.insert(v.begin() + 2, 13); //在begin()+2位置插入 13
        cout << "3) ";
        PrintVector(v.begin(), v.end());
        //3) 1 2 13 3 4 5
        v.erase(v.begin() + 2); //删除位于 begin() + 2的元素
        cout << "4) ";
        PrintVector(v.begin(), v.end());
        //4) 1 2 3 4 5
        vector<int> v2(4, 100); //v2 有4个元素,都是100
        v2.insert(v2.begin(), v.begin() + 1, v.begin() + 3);
        //将v的一段插入v2开头
        cout << "5) v2: ";
        PrintVector(v2.begin(), v2.end());
        //5) v2: 2 3 100 100 100 100
        v.erase(v.begin() + 1, v.begin() + 3);
        //删除 v 上的一个区间,即 2,3
        cout << "6) ";
        PrintVector(v.begin(), v.end());
        //6) 1 4 5
        return 0;
    }
    
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐