算法之路-预备篇(01)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的位置(包括它)开始复制,覆盖掉原有元素

猜你喜欢

转载自blog.csdn.net/weixin_44739495/article/details/110523041