【STL】vector容器
vector容器简介
- vector是将元素置于一个动态数组中加以管理的容器。
- vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,)。
- vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时
vector对象的默认构造
vector采用模板类实现
vector
vector
vector
vector
... //尖括号内还可以设置指针类型或自定义类型。
Class CA{};
vector<CA*> vecpCA; //用于存放CA对象的指针的vector容器。
vector
vector对象的带参数构造
- vector(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
- vector(n,elem); //构造函数将n个elem拷贝给本身。
- vector(const vector &vec); //拷贝构造函数
int iArray[] = {0,1,2,3,4};
vector
vector
vector
vector
vector
vector的赋值
- vector.assign(beg,end); //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
- vector.assign(n,elem); //将n个elem拷贝赋值给本身。
- vector& operator=(const vector &vec); //重载等号操作符
- vector.swap(vec); // 将vec与本身的元素互换。
vector
int iArray[] = {0,1,2,3,4};
vecIntA.assign(iArray,iArray+5);
vecIntB.assign( vecIntA.begin(), vecIntA.end() ); //用其它容器的迭代器作参数。
vecIntC.assign(3,9);
vector
vecIntD = vecIntA;
vecIntA.swap(vecIntD);
vector的大小
- vector.size(); //返回容器中元素的个数
- vector.empty(); //判断容器是否为空
- vector.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
- vector.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
例如 vecInt是vector
int iSize = vecInt.size(); //iSize == 3;
bool bEmpty = vecInt.empty(); // bEmpty == false;
执行vecInt.resize(5); //此时里面包含1,2,3,0,0元素。
再执行vecInt.resize(8,3); //此时里面包含1,2,3,0,0,3,3,3元素。
再执行vecInt.resize(2); //此时里面包含1,2元素。
vector末尾的添加移除操作
vector
vecInt.push_back(1); //在容器尾部加入一个元素
vecInt.push_back(3);
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);
vecInt.pop_back(); //移除容器中最后一个元素
vecInt.pop_back();
//{1,3,5}
vector的数据存取
- vec.at(idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
- vec[idx]; //返回索引idx所指的数据,越界时,运行直接报错
vector
vecInt.at(2) == vecInt[2] ; //5
vecInt.at(2) = 8; 或 vecInt[2] = 8; //vecInt 就包含 1, 3, 8, 7, 9值
int iF = vecInt.front(); //获取头部元素,iF==1
int iB = vecInt.back(); //获取尾部元素,iB==9
vecInt.front() = 11; //vecInt包含{11,3,8,7,9}
vecInt.back() = 19; //vecInt包含{11,3,8,7,19}
vector的插入
-
vector.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
-
vector.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
-
vector.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值
简单案例
vector
vector
vecA.push_back(1);
vecA.push_back(3);
vecA.push_back(5);
vecA.push_back(7);
vecA.push_back(9);
vecB.push_back(2);
vecB.push_back(4);
vecB.push_back(6);
vecB.push_back(8);
vecA.insert(vecA.begin(), 11); //{11, 1, 3, 5, 7, 9}
vecA.insert(vecA.begin()+1,2,33); //{11,33,33,1,3,5,7,9}
vecA.insert(vecA.begin() , vecB.begin() , vecB.end() ); //{2,4,6,8,11,33,33,1,3,5,7,9}
vector的删除
- vector.clear(); //移除容器的所有数据
- vec.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
- vec.erase(pos); //删除pos位置的数据,返回下一个数据的位置。
简单案例:
删除区间内的元素
vecInt是用vector声明的容器,现已包含按顺序的1,3,5,6,9元素。
vector::iterator itBegin=vecInt.begin()+1;
vector::iterator itEnd=vecInt.begin()+2;
vecInt.erase(itBegin,itEnd);
//此时容器vecInt包含按顺序的1,6,9三个元素。
//vector(动态数组)容器功能介绍
#include<iostream>
#include "vector"
using namespace std;
int main1()
{
vector<int> a;
cout << "a的长度" << a.size() << endl;
a.push_back(1);
a.push_back(2);
a.push_back(3);
//函数返回值当左值 应该返回一个引用
a.front() = 10;
a.back() = 100;
cout << "a的长度" << a.size() << endl;
cout << "a的首元素" << a.front() << endl;
while (a.size() != 0)
{
cout << "back " << a.back();
a.pop_back();
}
}
//输出容器内的所有元素 数组的方式,也可以用迭代器
void print(vector<int> &V)
{
for (int i = 0; i < V.size(); i++)
{
cout << V[i] << " ";
}
}
//vector的初始化
int main2()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
vector<int> v2 = v1;
vector<int> v3(v1.begin(), v1.begin() + 2); //2个元素进入容器
print(v3);
}
//vector的遍历 通过数组的方式
int main3()
{
vector<int> v1(10); //提前把内存准备好
for (int i = 1; i < 3; i++)
{
v1[i] = i + 1;
}
print(v1);
}
//1.迭代器的理解
// 1 2 3
// ▲ ▲
//begin() end()
//当 it == v1.end()的时候 说明这个容器已经遍历完毕了...
//end()的位置 应该是3的后面
//2 迭代器的种类
/*
typedef iterator pointer;
typedef const_iterator const_pointer;
typedef _STD reverse_iterator<iterator> reverse_iterator;
typedef _STD reverse_iterator<const_iterator> const_reverse_iterator;
*/
int main4() //输出容器内的所有元素 迭代器方式
{
vector<int> v1(10);
for (int i = 1; i < 3; i++)
{
v1[i] = i + 1;
}
//正序遍历
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout << *it << " ";
}
//逆序遍历
for (vector<int>::reverse_iterator it = v1.rbegin(); it != v1.rend(); it++)
{
cout << *it << " ";
}
}
//push_back强化记忆 从尾部添加元素
int main5()
{
vector<int> v(10); //提前把内存准备好
v.push_back(100);
v.push_back(200);
cout << "size" << v.size() << endl;
print(v);
}
//vector的删除操作:区间删除 指定位置删除 根据元素值删除
int main6()
{
vector<int> v1(10);
for (int i = 1; i < 8; i++)
{
v1[i] = i + 1;
}
print(v1);
//区间删除
v1.erase(v1.begin(), v1.begin() + 3);
print(v1);
//指定位置删除
v1.erase(v1.begin()+1); //删除首元素
cout<<endl;
//根据元素值删除
for(vector<int>::iterator it=v1.begin();it!=v1.end();)
{
if(*it==8)
it=v1.erase(it);
else
it++;
}
print(v1);
}
int main()
{
// main1();
// main2();
// main3();
// main4();
// main5();
main6();
return 0;
}