c++ STL库容器之向量vector

vector简介

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

在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector 默认指定。当存储的数据超过分配的空间时vector 会重新分配一块内存块,但这样的分配是很耗时的,在重新分配空间时它会做这样的动作:

                首先,vector 会申请一块更大的内存块;

                然后,将原来的数据拷贝到新的内存块中;

                其次,销毁掉原内存块中的对象(调用对象的析构函数);

                最后,将原来的内存空间释放掉。

当vector保存的数据量很大时,如果此时进行插入数据导致需要更大的空间来存放这些数据量,那么将会大大的影响程序运行的效率,所以我们应该合理的使用vector。


vector初始化

vector<T> v1;            // 默认的初始化方式,内容为空

vector<T> v2(v1);      // v2是v1的一个副本

vector<T> v3(n, i);  // v3中包含了n个数值为i的元素

扫描二维码关注公众号,回复: 2716660 查看本文章

vector<T> v4(n);       // v4中包含了n个元素,每个元素的值都是0


vector基本操作

(1)头文件#include<vector>.

(2)创建vector对象,vector<int> vec;

(3)尾部插入数字:vec.push_back(a);

(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

(5)使用迭代器访问元素.

(6)插入元素:    vec.insert(vec.begin()+i,a);        在第i个元素后面插入a;

(7)删除元素:    vec.erase(vec.begin()+2);          删除第3个元素

        vec.erase(vec.begin()+i,vec.end()+j);           删除区间[i,j-1];区间从0开始

(8)向量大小:vec.size();

(9)清空:vec.clear()   //清空之后,vec.size()为0


vector常用函数

empty():判断向量是否为空,为空返回真,否则为假

begin():返回向量(数组)的首元素地址

end(): 返回向量(数组)的末元素的下一个元素的地址

clear():清空向量

front():返回得到向量的第一个元素的数据

back():返回得到向量的最后一个元素的数据

size():返回得到向量中元素的个数

push_back(数据):将数据插入到向量的尾部

pop_back():删除向量尾部的数据

.....

一个介绍vector的简单程序

#include <iostream>
#include <vector>

using namespace std;

//这里我们抽象出一个函数,用来打印vec里的数据
void print(vector<int> vec)
{
    //用迭代器方式遍历向量vec
    int i = 0;
    vector<int>::iterator iter = vec.begin();
    while(iter != vec.end())
    {
        cout <<"value of vec[" << i << "]: " << *iter <<endl;
        i++;
        iter++;   //迭代器迭代
    }
}

int main()
{
    vector<int> vec;

    //打印初始向量vec的大小
    cout << "初始vec的大小" << vec.size() << endl;

    //给向量vector赋值
    for(int i = 0; i < 10; i ++)
    {
        vec.push_back(i);
    }
    //打印复制后vec的大小
    cout << "赋值后vec的大小" << vec.size() << endl;


    //用数组方式遍历向量vec
    cout << "用数组方式遍历向量vec: " <<endl;
    for(int i = 0; i < 10; i++)
    {
        cout <<"value of vec[" << i << "]: " << vec[i] << endl;
    }



    //用迭代器方式遍历向量vec
    cout << "用迭代器方式遍历向量vec: " << endl;
    int i = 0;
    vector<int>::iterator iter = vec.begin();
    while(iter != vec.end())
    {
        cout <<"value of vec[" << i << "]: " << *iter <<endl;
        i++;
        iter++;   //迭代器迭代
    }


    //测试vec的函数
    cout << "测试vec的函数" <<endl;

    //向向量vec中添加一个数,并打印出来
    vec.push_back(2018);
    cout << vec.back() <<endl;

    //打印刚刚添加后向量的值
    print(vec);

    //判断是否为空,为空返回真,反之返回假
    cout << vec.empty() <<endl;        //打印的值是0,说明vec不为空

    //删除向量尾部的数据
    cout << "删除之前尾部的数据为:" <<vec.back() << endl;
    vec.pop_back();
    cout << "删除之后尾部的数据为:" <<vec.back() << endl;
    return 0;
}


运行结果



猜你喜欢

转载自blog.csdn.net/young_Tao/article/details/79821616