网站哪里可以做做网站还赚钱么
网站哪里可以做,做网站还赚钱么,公司网站的设计规划,网站跨省备案在学习玩string后我们开始学习vector#xff0c;本篇博客将对vector进行简单的介绍#xff0c;还会对vector一些常用的函数进行讲解
vector的介绍
实际上vector就是一个数组的数据结构#xff0c;但是vector是由C编写而成的#xff0c;他和数组也有本质上的区别#xff…在学习玩string后我们开始学习vector本篇博客将对vector进行简单的介绍还会对vector一些常用的函数进行讲解
vector的介绍
实际上vector就是一个数组的数据结构但是vector是由C编写而成的他和数组也有本质上的区别但也有相同点他的特征概括如下
vector是表示可变大小数组的序列容器。就像数组一样vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问和数组一样高效。但是又不像数组它的大小是可以动态改变的而且它的大小会被容器自动处理。本质讲vector使用动态分配数组来存储它的元素。当新元素插入时候这个数组需要被重新分配大小为了增加存储空间。其做法是分配一个新的数组然后将全部元素移到这个数组。就时间而言这是一个相对代价高的任务因为每当一个新的元素加入到容器的时候vector并不会每次都重新分配大小。vector分配空间策略vector会分配一些额外的空间以适应可能的增长因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何重新分配都应该是对数增长的间隔大小以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。因此vector占用了更多的存储空间为了获得管理存储空间的能力并且以一种有效的方式动态增长。与其它动态序列容器相比deque, list and forward_list vector在访问元素的时候更加高效在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作效率更低。比起list和forward_list统一的迭代器和引用更好。
对于C语言中的数组二者有很多的异同点我将其概括如下
相同点
1 二者都是采用连续的空间来存储元素
2 二者都能通过下标进行访问
不同点
1 vector是采用动态开辟容器大小可以动态改变并且是自动处理
2vector会分配一些额外的空间以适应可能的增长因为存储空间比实际需要的存储空间更大 vector的使用
vector的定义
vector的定义就差不多是初始化以及拷贝构造和构造这些在之前的string类函数讲解中也提到了其实都大差不差的 构造并初始化 第一个参数是你要初始化元素的个数第二个参数是你要初始化成的字符 这里需要注意**里面就是你要放入vector里元素的类型**
vectorint v(10, 1);
for (auto ch : v)
{cout ch;
}
cout endl;拷贝构造 其实都大差不差学习了前面的string和类和对象后都很简单了 vectorint v(10, 1);vectorint v1(v);for (auto ch : v1){cout ch;}cout endl;vector iterator 的使用
迭代器很常用咱们做个简单的讲解 迭代器同样地分为正向和反向 我们可以通过一个简单的代码来了解迭代器的使用
vectorint v;
for (int i 1; i 5; i)
{v.push_back(i);
}
for (vectorint::iterator it v.begin(); it ! v.end(); it)
{cout *it;
}
cout endl;下面为反向迭代器 反向迭代器记得加上reverse
vectorint v;
for (int i 1; i 5; i)
{v.push_back(i);
}
for (vectorint::reverse_iterator it v.rbegin(); it ! v.rend(); it)
{cout *it;
}
cout endl;关于begin和rbeginend和rend的位置的关系如下图所示我们要记得两种迭代器都是从begin开始遍历 通过这张图我们需要注意到一个很重要的点 迭代器的区间都是左闭右开的所以end是在最后一个元素的后一个位置
vector 空间增长问题 其实空间增长问题我在之前的string类就有提到过都是有规律可循的 1 capacity的代码在vs和g下分别运行会发现vs下capacity是按1.5倍增长的g是按2倍增长的。vector增容都是2倍具体增长多少是根据具体的需求定义 2 reserve只负责开辟空间如果确定知道需要用多少空间reserve可以缓解vector增容的代价缺陷问题。 3 resize在开空间的同时还会进行初始化影响size
可以看到resize默认就是初始化为0 同时改变了capacity和size 而reserve只改变了capacity并且不会有初始化的功能
vectorint v;
v.reserve(10);
for (vectorint::iterator it v.begin(); it ! v.end(); it)
{cout *it;
}
cout endl;
cout former: endl;
cout v.size() endl;
cout v.capacity() endl;
v.reserve(20);
cout endl;
cout after: endl;
cout v.size() endl;
cout v.capacity() endl;vector 增删查改 pushback尾插和popback尾删
都很简单拿一段简单的代码来演示一下吧
vectorint v;
v.resize(10,1);
for (vectorint::iterator it v.begin(); it ! v.end(); it)
{cout *it;
}
cout endl;
v.push_back(2);
for (vectorint::iterator it v.begin(); it ! v.end(); it)
{cout *it;
}
cout endl;
v.pop_back();
for (vectorint::iterator it v.begin(); it ! v.end(); it)
{cout *it;
}
cout endl;insert插入函数 这里如果需要在其他地方插入就在begin上进行操作
vectorint v;
v.resize(10,1);
for (vectorint::iterator it v.begin(); it ! v.end(); it)
{cout *it;
}
cout endl;
vectorint::iterator it v.begin();
v.insert(it, 3);
for (vectorint::iterator it v.begin(); it ! v.end(); it)
{cout *it;
}
cout endl;erase函数 erase函数可以根据下标索引来删除元素但是再insert后要重新给下标赋值insert前的下标i已经失效了其实这就是所说的迭代器失效问题
在这里我们插入了元素后会发生扩容原空间可能已经被释放了或者说如果erase删除了最后一个位置的元素vector里已经没有元素可以删除也会导致迭代器失效但是erase后我们又使用it打印这里的it可能使用的就是原空间程序就会发生崩溃所以我们需要在执行完insert后再次对it进行赋值不然就会发生这种情况但是一些编译器对于迭代器失效没有过于严格的检查所以程序不会崩溃但是程序输出的结果不对
erase函数返回的是在vector对象中删除元素的后一个元素的指针 通常解决迭代器失效最简单的方法就是 对迭代器重新赋值
vectorint v;
v.resize(10,1);
for (vectorint::iterator it v.begin(); it ! v.end(); it)
{cout *it;
}
cout endl;
vectorint::iterator i v.begin();
v.insert(i3, 3);
for (vectorint::iterator it v.begin(); it ! v.end(); it)
{cout *it;
}
cout endl;
i v.begin();
v.erase(i3);
for (vectorint::iterator it v.begin(); it ! v.end(); it)
{cout *it;
}
cout endl;swap函数 我们通过一段简单的代码来了解一下 我们交换前打印两个vector对象中的元素交换后再打印一次
vectorint v1;
v1.resize(10,1);
cout 交换前 endl;
cout v1:;
for (vectorint::iterator it v1.begin(); it ! v1.end(); it)
{cout *it;
}
cout endl;
vectorint v2;
v2.resize(10, 2);
cout v2:;
for (vectorint::iterator it v2.begin(); it ! v2.end(); it)
{cout *it;
}
cout endl;
v1.swap(v2);
cout 交换后 endl;
cout v1:;
for (vectorint::iterator it v1.begin(); it ! v1.end(); it)
{cout *it;
}
cout endl;
cout v2:;
for (vectorint::iterator it v2.begin(); it ! v2.end(); it)
{cout *it;
}
cout endl;好了今天的分享到这里就结束了谢谢大家的支持
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89825.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!