广东网站建设找哪家,百度网站优化培训,网站关键词优化方案分为几个步骤,网站seo软件点击蓝字关注我们一、vector的介绍说的简单点#xff1a;vector是可以动态增长的数组容器vector是表示可变大小数组的序列容器。就像数组一样#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问#xff0c;和数组一样高效。… 点击蓝字关注我们一、vector的介绍说的简单点vector是可以动态增长的数组容器vector是表示可变大小数组的序列容器。就像数组一样vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问和数组一样高效。本质讲vector使用动态分配数组来存储它的元素。当新元素插入时候这个数组需要被重新分配大小为了增加存储空间。vector分配空间策略vector会分配一些额外的空间以适应可能的增长因为存储空间比实际需要的存储空间更大。。因此vector占用了更多的存储空间为了获得管理存储空间的能力并且以一种有效的方式动态增长。与其它动态序列容器相比deques, lists and forward_lists vector在访问元素的时候更加高效在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作效率更低。比起lists和forward_lists统一的迭代器和引用更好。二、vector的使用1、vector构造函数void test1()
{vectorint v1;//无参的构造用的最多vectorint v2(10,1);//用10个1来初始化vectorint v3(v2.begin(),v2.end());//用一段迭代器区间去初始化vectorint v4(v3);//拷贝构造string s(hello);vectorchar v5(s.begin(), s.end());//不同STL的迭代器区间也可以初始化
}结果展示打开监视窗口观察确实初始化好了问题对于下面这种情况是不是差不多呢能不能相互替代呢string s; 和 vectorchar v;不行的因为string末尾带着\0而且string提供了一些专门的字符串相关的接口函数比如operatorc_strfind等等函数2、迭代器的使用//vector中如何遍历
void test2()
{vectorint v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);//下标[]遍历for (size_t i 0; i v.size(); i){v[i] 1;cout v[i] ;}cout endl;//迭代器vectorint::iterator itv.begin();while (it ! v.end()){cout *it ;it;}cout endl;//反向迭代器vectorint::reverse_iterator rit v.rbegin();while (rit ! v.rend()){cout *rit ;rit;}//范围forfor (auto e : v){cout e ;}cout endl;
}3、空间增长问题void test3()
{vectorint v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);cout v.size() endl;cout v.capacity() endl;cout v.empty() endl;cout endl;v.reserve(100);//改变capacitycout v.size() endl;cout v.capacity() endl;cout v.empty() endl;cout endl;v.resize(10,1);//改变size默认给上缺省值0,它可以 扩容初始化 或者 删除数据cout v.size() endl;cout v.capacity() endl;cout v.empty() endl;cout endl;v.resize(2);cout v.size() endl;cout v.capacity() endl;cout v.empty() endl;cout endl;
}结果展示总结capacity的代码在vs和g下分别运行会发现vs下capacity是按1.5倍增长的g是按2倍增长的。这个问题经常会考察不要固化的认为顺序表增容都是2倍具体增长多少是根据具体的需求定义的。vs是PJ版本STLg是SGI版本STL。reserve只负责开辟空间如果确定知道需要用多少空间reserve可以缓解vector增容的代价缺陷问题。resize在开空间的同时还会进行初始化影响size。4、增删查改问题void test4()
{
vectorint v;
//push_back尾插v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);//find查找
vectorint::iterator ret find(v.begin(), v.end(),3);
auto ret1 find(v.begin(), v.end(), 3);
//可以用auto替换
if (ret ! v.end()){
cout 找到了 endl;}v.insert(ret, 100);
for (auto e : v){
cout e ;}vectorint::iterator pos find(v.begin(), v.end(), 1);
if (pos ! v.end())//判断数据是否合法{
//erase删除v.erase(pos);}
cout endl;
}结果演示operator[ ] 和范围for是vector中常用的遍历手段// vector使用这两种遍历方式是比较便捷的。
#include iostream
#include vector
using namespace std;
int main()
{
int a[] { 1, 2, 3, 4 };
vectorint v(a, a sizeof(a) / sizeof(int));// 通过[]读写第0个位置。v[0] 10;
cout v[0] endl;// 通过[i]的方式遍历vector
for (size_t i 0; i v.size(); i)
cout v[i] ;
cout endl;vectorint swapv;swapv.swap(v);
cout v data:;
for (size_t i 0; i v.size(); i)
cout v[i] ;
cout endl;cout swapv data:;
for (size_t i 0; i swapv.size(); i)
cout swapv[i] ;
cout endl;// C11支持的新式范围for遍历
for (auto x : v)
cout x ;
cout endl;
return 0;
}vector是支持迭代器的还可以用范围for对vector进行遍历支持迭代器就支持范围for因为在编译时编译器会自动将范围for替换为迭代器遍历的形式。*声明本文于网络整理版权归原作者所有如来源信息有误或侵犯权益请联系我们删除或授权事宜。戳“阅读原文”我们一起进步