教你使用STL容器之vector

C++语言本身提供了一个序列式容器array,STL另外再提供vector、list、deque、stack、queue、priority_queue等序列式容器。

vector的数据安排以及操作方式,与array是很相似的,唯一的不同点在于空间的运用的灵活性,array是静态的,一旦配置了就不能再改变了,而vector是动态开辟空间的,随着元素的不断加入,内部机制会自行进行扩充来容纳元素。如果每增加一个元素,扩充一个空间,是不明智的,所以vector底层实现时,会一次性扩充好旧空间的2倍。

扩充的过程大致如下:开辟新空间; 搬移元素;释放旧空间。
模拟实现vector

1.包含头文件

#include <vector>

2.vector声明及初始化

//初始化
vector<int> v1;//声明一个int型的向量,初始值为0
vector<int> v2(10);//声明一个初始值为10的向量,初始值为0
vector<int> v3(10, 1);//声明一个初始值为1且有10个元素的向量
vector<int> tmp(v3.begin(), v3.begin() + 2);//用v3的第0个到第1个值初始化tmp
int arr[] = { 1, 2, 3, 4, 5 };
vector<int> v4(arr, arr + 5);//用数组元素进行初始化向量
vector<int> v5(&arr[1], &arr[3]);//用数组中某一段地址进行初始化向量

监视窗口,主要查看v4和v5的初始化是否按照我们预期的初始化。
这里写图片描述

3.vector的基本使用

(1)容量(Capacity)

v.size();//向量大小
v.max_size();//向量最大容量
v.capacity();//向量真实大小
v.empty();//向量判空
v.resize(newsize);//更改向量的大小

(2)修改(Modifiers)

v.assign();//多个元素赋值
v.push_back(data);//尾插
v.pop_back();//尾删
v.insert();//任意位置插入元素
v.erase();//任意位置删除元素
v.swap();//交换两个vector
v.clear();//清空向量元素

将几个有多个函数原型的修改函数重点拿出来讲一下。

assign

assign函数原型:

template <class InputIterator>
void assign ( InputIterator first, InputIterator last );
void assign ( size_type n, const T& u );

assign的使用:

     vector<int> v1;//声明一个int型的向量,初始值为0
     vector<int> v2;
     v1.assign(5, 1);
     vector<int>::iterator it = v1.begin();
     v2.assign(it + 1, v1.end() - 1);

这里写图片描述

insert

insert的函数原型:

iterator insert ( iterator position, const T& x );//在任意位置插入一个元素
void insert ( iterator position, size_type n, const T& x );//在任意位置插入n个元素
template <class InputIterator>
void insert ( iterator position, InputIterator first, InputIterator last );//在任意位置插入某一段元素

erase

erase的函数原型:

iterator erase ( iterator position );//删除任意位置的一个元素
iterator erase ( iterator first, iterator last );//删除任意位置的多个元素

swap

swap的函数原型:

void swap ( vector<T,Allocator>& vec );//交换两个数组的元素
//使用
v1.swap(v2);

(3)迭代器

v.begin();//开始指针
v.end();//末尾指针
v.rbegin();//反向迭代器的开始指针
v.rend();//反向迭代器的末尾指针

(4)元素访问

v[2];//下标访问,不会检查是否越界
v.at(2);//下标访问,会检查是否越界,越界抛出异常
v.front();//访问第一个元素
v.back();//访问最后一个元素

(5)算法

遍历元素

//方法一
vector<int>::iterator it;
for( it = v.begin(); it != v.end(); it++){
    cout<<*it<<endl;
}

//方法二
for(size_t i=0; i<v.size(); i++){
    cout<<v.at(i)<<endl;
}

翻转元素

#include <algorithm>
reverse(v.begin(), v.end());

排序元素

//方法一,从小到大排序,如果想要相反的,可以用上面的翻转
#include <algorithm>
sort(v.begin(), v.end());

//方法二,仿函数
bool Comp(const int& a, const int& b){
        return a > b;
}
sort(v.begin(), v.end(), Comp);

查看文档进一步学习

猜你喜欢

转载自blog.csdn.net/ZWE7616175/article/details/81626064
今日推荐