STL vector详解
在此专栏,我将给出很多算法的讲解,但之前,因为是使用C++刷题,所以提前总结一下C++的各种容器也就是数据结构的用法,因为第一部分会讲解数组,所以预备篇的第一篇我们讲解C++中刷题几乎必用的动态数组vector,话不多说,直入主题----
一 什么是vector
最简单的说明:
vector是可以动态增加元素的数组,内部实现与数组很类似,不同之处就是有预存空间,可以提供动态扩充的地方,如果预留的空间也满了,就重新寻找空间,找二倍空间,然后拷贝过去然后释放当前的空间,这就导致 vector 容器在进行扩容后,与其相关的指针、引用以及迭代器可能会失效。所以在刚开始声明大小是很好的习惯。
后面的代码,默认声明了一个vector类对象TurVector。所以出现TurVector.XXX()就是vector对象可以调用的方法,这和直接调用的方法有所区别
二 初始化vector
vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值默认为0。vector<int> a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1
vector<int> a(b); //用b向量来创建a向量,整体复制性赋值
vector<int> a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素,begin+3虽然指向第四个,但是后面的闭函数,也就是不包括
int b[7]={
1,2,3,4,5,9,8};
vector<int> a(b,b+7); //从数组中获得初值
三 增加数据
往数组最后面增加数据
TurVector.push_back(23);
和C#不同的是,不能通过TurVector【12】=12,这样给第十三个位置增加元素,如果12位置还没东西的时候,这里也显示了C#的高封装性,之前用的时候感觉很简单的东西,很多C++都是不能直接使用的。
四 删除数据
1 删除末尾的元素(像不像栈哈哈)
TurVector.pop_back();
2 删除指定位置的元素
TurVector.erase(TurVector.begin()+2);
这是删除第三个元素的意思,使用C#的时候直接传下标就行了,为什么C++不是直接传下标,因为STL就没给你这个选择,人家erase方法就只允许传迭代器进去,啥是迭代器,就是STL封装的一个数据类,可能包括很多指针,但是数据却是一个接一个存放的,而且一般写算法,建议不要删除数据,原因是删除会影响数据结构,最好是修改或者用其他数组。
3 删除区间
TurVector.erase(TurVector.begin()+i,TurVector.begin()+j);
删除区间[i,j-1];区间从0开始
五 修改数据
1 知道要修改的位置
TurVector[12]=123;
这样直接修改第十三个数字为123.
六 插入数据
假设TurVector现在内容是【1,2,3】
1 往指定位置插入一个数据
TurVector.insert(v.begin(),8);//在最前面插入新元素,此时TurVector为8,1,2,3
2 往指定位置插入多个数据
TurVector.insert( TurVector.end(),3,0);//在尾部插入3个0,此时TurVector为8,1,2,3,0,0,0
3 往指定位置插入多个不同数据
TurVector.insert(TurVector.end(),TurVector.begin(),TurVector.begin+2());//在尾部插入(8,1)后面依旧是闭函数,此时TurVector为8,1,2,3,0,0,0,8,1
七 查询数据
头文件里面的方法find
vector<int>::iterator it = find(TurVector.begin(),TurVector.end(), 6);
查询是否有6,如果有返回迭代器指针,*it就是6了。找不到返回end迭代器
八 遍历数据
1 C++11中的新遍历方法
for (auto it : TurVector)
{
cout<<it;
}
缺点是找到后,不能操作他前后的数据
2 基本所有的容器都可以这样遍历
for (std::vector<int>::iterator it = TurVector.begin(); it != TurVector.end(); ++it)
{
cout<<*it;
}
九 中的其他方法排序拷贝等
1 排序
sort(TurVector.begin(),TurVector.end()); //对TurVector中的从TurVector.begin()(包括它)到TurVector.end()(不包括它)的元素进行从小到大排列
2 倒序
reverse(TurVector.begin(),TurVector.end()); //对TurVector中的从TurVector.begin()(包括它)到TurVector.end()(不包括它)的元素倒置,但不排列,如TurVector中元素为1,3,2,4,倒置后为4,2,3,1(第二个参数不包括)
3 拷贝
copy(TurVector.begin(),TurVector.end(),TurVector.begin()+1); //把TurVector中的从TurVector.begin()(包括它)到TurVector.end()(不包括它)的元素复制到TurVector中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素