STL — vector容器用法详解

时间:2021-06-17 04:18:22

vector容器用法详解

                                                                                          



vector容器作为STL常用容器之一它实现了动态数组,用于元素数量变化的对象数组。像数组一样,vector类也用从0开始

的下标表 元素的位置;但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和

缩小而自动变化 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为

了增加存储空间。其做法 是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任

务,因为每当一个新的元素加入到 器的时候,vector并不会每次都重新分配大小。

vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同

库采用 同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插

入一个元素的时 候是 在常数时间的复杂度完成的。

当然我们如果真正实现一个vector的时候我们对它的理解可能会更加的深刻,这个以后我应该会补充但是现在我们首先学

会如何来 使用vector,我们先瞧瞧vector当中都有什么功能.


容器初始化

                                                                                                                                   


下面为初始化的各种形式,各种姿势任你解锁~

int main()
{

vector<int> arr;
//声明一个int型变量.

vector<int> arr1(10);
// 声明一个初始大小为10的int对象.

vector<int> arr2(10, 1);
//声明一个初始大小为10且值都是1的对象.

vector<int> arr3(arr);
//利用一个vector对象初始化自己

vector<int> arr4(arr.begin(), arr.begin() + 3);
//用对象arr的第0个到第2个值初始化arr4;

int array[5] = { 1, 2, 3, 4, 5};
vector<int> arr5(array, array + 5);
//将array数组用于初始化arr5对象.

vector<int> arr6(&array[1], &array[4]);
//将array[1]~array[4]范围内的元素作为vec的初始值.

return 0;

}



判断容器大小

                                                                                                                                                                                                                                                                    
具体有三个函数:

int size() const:返回容器中元素的个数

int capacity() const:返回当前容器所能容纳的最大元素值

int max_size() const:返回最大可允许的vector元素数量值


代码演示:

int Test()
{


int array[5] = { 1, 2, 3, 4, 5 };

vector<int> arr5(array, array + 5);

cout << "该容器中的元素个数为:" << arr5.size() << endl;

cout << endl;

cout << "该容器当前的最大容量为:" << arr5.capacity() << endl;

cout << endl;

cout << "该容器最大可以允许vector的元素数量为:" << arr5.max_size() << endl;

cout << endl;

system("pause");

return 0;
}



运行结果:

STL — vector容器用法详解



容器内添加元素

                                                                                                                                        

添加元素具有4个函数:

void push_back(const T& x):向量尾部增加一个元素X

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

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

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

代码演示:


1*****************

//第零种插入方法:直接在vector的最后一个元素后面插入数据
vector<int> arr;

arr.push_back(1);

arr.push_back(2);

arr.push_back(3);

arr.push_back(4);

vector<int>::iterator it;

it = arr.begin();

cout << "插入后的vector当中元素分别为: ";

for (it = arr.begin(); it < arr.end(); it++)
{
cout << *it << " ";
}

cout << endl;


运行结果:

STL — vector容器用法详解



2*****************

//第一种插入方法:在vector中往it指向的节点前面插入单个数据
vector<int> arr(5, 1);

vector<int>::iterator it1;

it1 = arr.begin();

it1 = arr.insert(it1, 200);

cout << "插入后的vector当中元素分别为: ";

for (it1 = arr.begin(); it1 < arr.end(); it1++)
{
cout << *it1 << " ";
}

cout << endl;


运行结果:

STL — vector容器用法详解



3*****************

//第二种插入方法:在vector中往it指向的节点前面n个数据.

vector<int> arr(5, 1);

vector<int>::iterator it2;

it2 = arr.begin();

arr.insert(it2, 2, 300);

cout << "插入后的vector当中元素分别为: ";

for (it2 = arr.begin(); it2 < arr.end(); it2++)
{
cout << *it2 << " ";
}

cout << endl;


运行结果:


STL — vector容器用法详解



4*****************

//第三种插入方法: 在vector中利用别的的vector中的元素插入到iterator指向节点的前面.

//第四种插入方法: 在vector中利用数组中的任意长度的元素插入到iterator指向节点的前面.

vector<int> arr(5, 1);

vector<int> array(2, 400);

vector<int>::iterator it3;

it3 = arr.begin();

arr.insert(it3 + 2, array.begin(), array.end());

int myarray[] = { 200, 300, 300 };

arr.insert(arr.begin(), myarray, myarray + 3);

cout << "插入后的vector当中元素分别为: ";

for (it3 = arr.begin(); it3 < arr.end(); it3++)
{
cout << *it3 << " ";
}

cout << endl;



运行结果:


STL — vector容器用法详解




容器遍历元素

                                                                                                                                             

遍历元素常用函数 :

reference at(int pos):返回pos位置元素的引用

reference front():返回首元素的引用

reference back():返回尾元素的引用

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

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

reverse_iterator rbegin():反向迭代器,指向最后一个元素

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


代码演示:


1********************

vector<int> arr(5, 1);

vector<int>::iterator it;
//声明迭代器

//begin() end()同理
it = arr.begin();

cout << "arr的第一个元素为: ";

cout << *it << endl;

//front() back() at() 返回目标位置引用.

int& a1 = arr.front();

int& a2 = arr.back();

int& a3 = arr.at(3);

it = arr.begin();
cout << "原始时的vector当中元素分别为: ";

for (it = arr.begin(); it < arr.end(); it++)
{
cout << *it << " ";
}

cout << endl;

a1 = 100;

a2 = 200;

a3 = 300;

it = arr.begin();

cout << "修改后的vector当中元素分别为: ";

for (it = arr.begin(); it < arr.end(); it++)
{
cout << *it << " ";
}

cout << endl;


运行结果;


STL — vector容器用法详解


2********************

vector<int> arr(5);

int i = 0;

vector<int>::reverse_iterator rit = arr.rbegin();

for (; rit != arr.rend(); ++rit)

*rit = ++i;

std::cout << "vector的元素分别为:";

for (vector<int>::iterator it = arr.begin(); it != arr.end(); ++it)

cout << ' ' << *it;

cout << endl;

运行结果:

STL — vector容器用法详解





容器删除元素

                                                                               


i terator erase(iterator it) :删除向量中迭代器指向元素

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

void pop_back() :删除向量中最后一个元素

void clear() : 清空向量中所有元素



代码演示:

1********************

std::vector<int> arr;

for (int i = 1; i <= 10; i++)
{
arr.push_back(i);
}

cout << "原始时的vector里面的元素分别是: ";

for (unsigned i = 0; i < arr.size(); ++i)
{
cout << arr[i] << " ";
}

cout << endl;

//指定的pos位置删除.
arr.erase(arr.begin() + 5);

//指定区间(begin , end)删除.
arr.erase(arr.begin(), arr.begin() + 3);

cout << "删除后的vector里面的元素分别是: ";

for (unsigned i = 0; i < arr.size(); ++i)
{
cout << arr[i] << " ";
}

cout << endl;


运行结果:

STL — vector容器用法详解



2********************

std::vector<int> arr;

for (int i = 1; i <= 10; i++)
{
arr.push_back(i);
}

cout << "原始时的vector里面的元素分别是: ";

for (unsigned i = 0; i < arr.size(); ++i)
{
cout << arr[i] << " ";
}

cout << endl;

arr.pop_back();

arr.pop_back();

arr.pop_back();

cout << "删除后的vector里面的元素分别是: ";

for (unsigned i = 0; i < arr.size(); ++i)
{
cout << arr[i] << " ";
}

cout << endl;

运行结果:

STL — vector容器用法详解



3********************

std::vector<int> arr;

for (int i = 1; i <= 10; i++)
{
arr.push_back(i);
}

cout << "原始时的vector里面的元素分别是: ";

for (unsigned i = 0; i < arr.size(); ++i)
{
cout << arr[i] << " ";
}

cout << endl;

//放大招了,删除所有元素
arr.clear();

cout << "删除后的vector里面的元素分别是: ";

for (unsigned i = 0; i < arr.size(); ++i)
{
cout << arr[i] << " ";
}

cout << endl;

运行结果:

STL — vector容器用法详解




总结

                                                                

我们掌握这些知识vector的基本功能,vector还有很多很多的操作,我们一定要能够熟练运用vector.比如它还有这些功能:


STL — vector容器用法详解


还有排序,判空这里我就不一一演示了,我们平时多用vector取代数组,慢慢地你就发现vector越来越好用,加油~

虽然很多公司貌似不是很喜欢STL,不过呢这些东西我相信存在即合理,东西应该是没问题的只要我们会使用,然后

有时间看看底层的源码,相信大家会灵活运用STL.这里的vector以后我可能会自己实现一个简单的vector.