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;
}
运行结果:
容器内添加元素
添加元素具有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;
运行结果:
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;
运行结果:
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;
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;
运行结果:
容器遍历元素
遍历元素常用函数
:
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;
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;
运行结果:
容器删除元素
i
terator erase(iterator it) :删除向量中迭代器指向元素
iterator erase(iterator first, iterator last) : 删除向量中[first, last)中元素
void pop_back() :删除向量中最后一个元素
void clear() : 清空向量中所有元素
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;
运行结果:
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;
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;
运行结果:
总结
我们掌握这些知识vector的基本功能,vector还有很多很多的操作,我们一定要能够熟练运用vector.比如它还有这些功能:
还有排序,判空这里我就不一一演示了,我们平时多用vector取代数组,慢慢地你就发现vector越来越好用,加油~
虽然很多公司貌似不是很喜欢STL,不过呢这些东西我相信存在即合理,东西应该是没问题的只要我们会使用,然后
有时间看看底层的源码,相信大家会灵活运用STL.这里的vector以后我可能会自己实现一个简单的vector.