蓝桥备战 C++中的STL容器(1) —— vector

1.vector是什么

vector是一个动态的,可以存放任意数据类型(甚至类及其对象)的顺序(或者说线性的)容器类,在蓝桥杯中,我们一般将其用做动态数组。


2.vector的使用

实际的使用中首先我们需要导入库,以及vector是定义在标准命名空间下的

#include<vector>
using namespace std;

究其根本,vector是个类,那么他就会有构造函数(甚至有很多重载)

vector<T>;
//创建一个空vector
vector<T>();
//创建一个空vector
vector<T>(int nSize);
//创建一个vector,元素个数为nSize
vector<T>(int nSize,const t& t);
//创建一个vector,元素个数为nSize,且值均为t
vector<T>(const vector&);
//复制构造函数
vector<T>(begin,end);
//复制[begin,end)区间内另一个数组的元素到vector中

我们可以看到有两个创建空vector的方式,那我们不妨来揣摩一下创作者的意图

很明显第二种创建方式是常规的调用构造函数的形式,而第一种更像是将vector<T>作为了一个复杂数据类型去创建了一个变量,这大概是为了保留C语言的写法习惯(我猜的),也让还未学习面向对象编程的同学可以先体验到stl容器的方便。

创建好这样一个动态数组后,我们能干的事情有哪些呢,回到老四样“增删改查”


1.增

向vector中插入元素的方式主要通过两个函数(及其重载)

void push_back(const T& x);
//向vector的尾部插入x

iterator insert(iterator it,const T& x);
//vector中迭代器指向元素前增加一个元素x

iterator insert(iterator it,int n,const T& x);
//vector中迭代器指向元素前增加n个元素x

iterator insert(iterator it,const_iterator first,const_iterator last);
//vector中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据


/*
只能对已存在的元素进行赋值或者修改操作,如果是要加入新元素,务必使用push_back或insert
push_back的作用有两个:告诉编译器为新元素开辟空间、将新元素存入新空间里

比如下面的代码是错误的,但是编译器不会报错,就像是数组越界。
vector<int> vec;
vec[0] = 1;  //错误!
*/

补充一点,iterator是stl容器中的迭代器,其对于stl容器的作用相当于指针之于数组

声明方式如

vector<T>::iterator iter;

这样我们就得到一个没有指向任何容器内的任何对象的空的迭代器,那么他应该指向哪里呢,(或者说怎么做初始化呢),等到“查”的部分我们再揭晓


2.删

iterator erase(iterator it);
//删除vector中it迭代器指向的元素

iterator erase(iterator first,iterator last);
//删除vector中[first,last)中所有元素

void pop_back();
//删除vector中最后一个元素

void clear();
//清空vector中所有元素

void remove();				
//删除vector中所有和指定元素值相等的元素,但该函数不会改变容器的大小

3.改

void swap(vector<T>&)
//交换两个同类型vector的数据

void assign(int n,const T& x)
//设置vector中前n个元素的值为x

void assign(const_iterator first,const_iterator last)
//vector中[first,last)中元素设置成当前向量元素

4.查

iterator begin()
//返回vector头指针,指向第一个元素

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

bool empty();
//返回vector是否为空

int size();
//返回vector元素的个数

在查这一部分,多提一嘴,vector允许你以数组的操作形式来访问他的元素,例如第一部分中提到的vec[0]会正确的访问到该vector的第一个元素


5.综合使用

比如遍历一个vector

vector<int> vec;

void printVec(){
    for(vector<int>::iterator iter = vec.begin();iter != vec.end();iter++){
        std::cout << *iter << endl;
    }
}

或者配合algorithm库中的一些函数来使用vector(或者其他的stl容器)

sort(vec.begin(),vec.end());

reverse(vec.begin(),vec.end());

max_element(vec.begin(),vec.end());

min_element(vec.begin(),vec.end());

upper_bound(vec.begin(),vec.end(),num);

lower_bound(vec.begin(),vec.end(),num);

能用的函数还有很多很多,比如find(),copy(),这里不再列举啦


3.暂未提到的vector重要知识

vector的push_back扩容机制是面试中常考的内容,但本人的内容偏新手向,这种较为底层的内容不适合放在此处,等大家成长为高手后,再去了解一下吧

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.芊羽.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值