当前位置: 首页 > news >正文

辽宁网站建设价位模板建站和自助建站

辽宁网站建设价位,模板建站和自助建站,西安建站价格表,wordpress预览pdf目录 引言 vector容器的基本概念 1.功能 2.动态大小 3.动态扩展 vector的接口 1.vector的迭代器 2.vector的初始化与销毁 3.vector的容量操作 3.1 有效长度和容量大小 (1)使用示例 (2)扩容机制 3.2 有效长度和容量操作 (1)reserve (2)resize 4.vector的访问操作…目录 引言 vector容器的基本概念 1.功能 2.动态大小 3.动态扩展 vector的接口 1.vector的迭代器 2.vector的初始化与销毁 3.vector的容量操作 3.1 有效长度和容量大小 (1)使用示例 (2)扩容机制 3.2 有效长度和容量操作 (1)reserve (2)resize 4.vector的访问操作 5.vector的修改操作 迭代器失效 结束语 引言 在我的博客 C——string的了解和使用 中我们学习了标准模板库STL中的string的一些基础内容今天我们来学习 vector 。 vector容器的基本概念 在C中vector 是一个非常重要的容器它属于标准模板库的一部分。vector 提供了一种动态数组的实现可以在运行时动态地增加或减少其大小同时保持元素的连续存储。 1.功能 vector是可变大小的序列容器采用连续存储空间存储元素可通过下标高效访问。 2.动态大小 与静态数组不同vector 的大小可以在运行时动态地改变。此外静态数组内数据通常存储在栈上而vector中数据存储在堆上。 3.动态扩展 动态扩展的核心在于当现有内存空间不足以满足需求时不是简单地在原空间后续接新空间这在连续内存分配中通常是不现实的因为后续空间可能已被其他程序或数据占用而是采取以下步骤 (1)分配新空间找到一个足够大的、连续的新内存空间。这个新空间的大小要能够容纳原数据和新数据。 (2)数据拷贝将原内存空间中的数据复制到新分配的内存空间中。这个过程中需要确保数据的完整性和正确性。 (3)释放原空间在数据成功拷贝到新空间后释放原来的内存空间。这一步是为了避免内存泄漏。 (4)更新指针将指向原内存空间的指针更新为指向新内存空间的指针。这样程序就可以继续在新空间中操作数据。 此外使用vector时必须包含头文件 #includevector 。 vector的接口 我们使用如下文档来辅助我们学习vector vector的接口详细介绍 1.vector的迭代器 与string一样vector中也有迭代器。由于vector定义在vector类中因此我们想要使用vector的迭代器需要通过域作用限定符访问——vector类型::iterator 。 其中begin()end()rbeign()rend()的使用访问方法与string中的类似 我们来看看代码演示 int main() {vectorint vec { 0,1,2,3,4,5,6,7,8,9 };vectorint::iterator it vec.begin();cout 顺序遍历;while (it ! vec.end()){cout *it ;it;}cout endl;cout 逆序遍历;vectorint::reverse_iterator rit vec.rbegin();while (rit ! vec.rend()){cout *rit ;rit;}return 0; } 输出结果如下 同样的vector也支持const_iterator int main() {vectorint vec { 0,1,2,3,4,5,6,7,8,9 };for (vectorint::const_iterator it vec.begin(); it ! vec.end(); it) {std::cout *it ;}std::cout std::endl;return 0; } 2.vector的初始化与销毁 vector 类的赋值运算符 operator 被重载以支持将一个 vector 的内容复制到另一个 vector 中。 vector 支持多种构造函数拷贝构造以及赋值运算符重载。 下面是一些简单的使用 void printVector(vectorint vec) { for (vectorint::iterator it vec.begin(); it ! vec.end(); it){cout *it ;}cout endl; }int main() {vectorint vec1; for (int i 0; i 5; i){vec1.push_back(i);}vectorint vec2(vec1.begin(), vec1.end()); vectorint vec3(5, 5); vectorint vec4(vec3); cout 打印vec2: ;printVector(vec2);cout 打印vec3: ;printVector(vec3);cout 打印vec4: ;printVector(vec4);return 0; } 输出结果为 int main() {vectorint vec1, vec2;for (int i 0; i 5; i){vec1.push_back(i);}vec2 vec1;printVector(vec2);return 0; } 输出结果为 3.vector的容量操作 如下表格是关于vector的一些基础的容量操作 函数名称功能size返回vector的有效长度capacity返回vector的容量大小clear清空vectorempty检查vector是否为空是则返回ture否则返回falsereserve请求改变vector的容量resize重新设置有效元素的数量超过原来有效长度则用c字符填充 3.1 有效长度和容量大小 (1)使用示例 与 string类 类似我们可以使用 size()返回容器的有效长度capacity()返回容器的容量大小。 下面是简单的测试用例 int main() {vectorint vec { 0,1,2,3,4,5,6,7,8,9 };cout vec.size() endl;cout vec.capacity() endl;if (vec.empty()){cout vec为空 endl;}else{cout vec不为空 endl;}vec.clear();if (vec.empty()){cout vec为空 endl;}else{cout vec不为空 endl;}return 0; } 输出结果为 通常来说vector的有效长度和容量大小相同 (2)扩容机制 接下来我们来看看vector的扩容机制 int main() {size_t sz;vectorint vec;sz vec.capacity();cout making vec grow: endl;for (int i 0; i 100; i){vec.push_back(i);if (sz ! vec.capacity()){sz vec.capacity();cout capacity changed: sz endl;}} } 输出结果为 在vs2022中vector是以1.5倍进行扩容处理的 我们现在把这段代码放到g中运行看看 我们可以看到在此环境中vector是以二倍进行扩容的。 3.2 有效长度和容量操作 接下来我们来学习vector中的reserve和resize这俩函数的使用与string中的差不多。 (1)reserve reserve 函数用于请求改变容器的容量即分配足够的内存空间以容纳至少指定数量的元素 简单使用一下 int main() {vectorint vec;vec.reserve(10);cout vec.capacity() endl;return 0; } 输出结果为 (2)resize resize的使用有如下两种 resize(int num); 如果 num 小于当前容器的大小那么容器末尾的多余元素将被删除。如果 num 大于当前容器的大小则容器将被扩展新添加的元素将被初始化为该类型的默认值对于内置类型如 int默认值为 0。 resize(int num, int elem); 这个方法同样用于将 std::vector 的大小调整为 num但在容器需要扩展时新添加的元素将被初始化为 elem 而不是默认值。如果 num 小于当前容器的大小多余元素的处理方式与第一个 resize 方法相同即被删除。 简单的使用一下 int main() {vectorint vec { 1,2,3,4,5 };vec.resize(3);for (int i 0; i vec.size(); i){cout vec[i] ;}cout endl;vec.resize(4);for (int i 0; i vec.size(); i){cout vec[i] ;}cout endl;vec.resize(5, 9);for (int i 0; i vec.size(); i){cout vec[i] ;}cout endl;return 0; } 输出结果为 4.vector的访问操作 vector的访问操作有如下几个 函数名称功能operator[]返回指定位置的元素越界则报错at返回指定位置的元素越界则抛异常front返回字符串第一个元素back返回字符串最后一个元素 这些函数的用法也与string中的函数用法差不多就不多介绍了来看看代码 int main() {vectorint vec { 0,1,2,3,4,5,6,7,8,9 };for (int i 0; i vec.size(); i){cout vec[i] ;}cout endl;for (int i 0; i vec.size(); i){cout vec.at(i) ;}cout endl;cout front vec.front() endl;cout back vec.back() endl;return 0; }输出结果为 5.vector的修改操作 vector的修改操作有如下几个 函数名称功能push_back在数组后追加元素pop_back删除数组最后一个元素insert在指定位置追加元素assign使用指定数组替换原数组erase删除数组指定部分区间swap交换两个数组 先来看看push_back()pop_back()assign()swap() int main() {vectorint vec1 { 0,1,2,3,4,5,6,7,8,9 };cout back: vec1.back() endl;// 元素尾插vec1.push_back(10);// 元素尾删cout back: vec1.back() endl;vec1.pop_back();cout back: vec1.back() endl;vectorint vec2 { 9,9,9,9,9 };vec2.assign(3, 3);for (int i 0; i vec2.size(); i){cout vec2[i] ;}cout endl;vec2.swap(vec1);for (int i 0; i vec1.size(); i){cout vec1[i] ;}cout endl;for (int i 0; i vec2.size(); i){cout vec2[i] ;}cout endl;return 0; } 输出结果如下 我们再来看看insert和erase insert函数 来看代码 int main() {vectorint vec1(5, 10);vectorint::iterator it vec1.begin();it vec1.insert(it, 100);cout vec1:;for (it vec1.begin(); it vec1.end(); it){cout *it ;}cout endl;vec1.insert(it, 2, 1000);it vec1.begin();cout vec1:;for (it vec1.begin(); it vec1.end(); it){cout *it ;}cout endl;vectorint vec2(2, 10000);it vec1.begin();vec1.insert(it 2, vec2.begin(), vec2.end());cout vec1:;for (it vec1.begin(); it vec1.end(); it){cout *it ;}cout endl;return 0; } 输出结果为 erase函数 简单的代码演示如下 int main() {vectorint vec { 0,1,2,3,4,5,6,7,8,9 };vectorint::iterator it vec.erase(vec.begin() 3); // 删除值为3的元素it vec.erase(it); // 删除值为4的元素for (int i 0; i vec.size(); i){cout vec[i] ;}cout endl;it vec.erase(vec.begin(), vec.begin() 5);for (int i 0; i vec.size(); i){cout vec[i] ;}cout endl;return 0; } 输出结果为 迭代器失效 迭代器的主要作用就是让算法能够不用关心底层数据结构其底层实际就是一个指针或者是对 指针进行了封装比如vector的迭代器就是原生态指针T* 。因此迭代器失效实际就是迭代器 底层对应指针所指向的空间被销毁了而使用一块已经被释放的空间造成的后果是程序崩溃(即 如果继续使用已经失效的迭代器程序可能会崩溃)。 以下可能会导致迭代器失效 1.会引起其底层空间改变的操作都有可能使迭代器失效 int main() {vectorint v{ 1,2,3,4,5,6 };auto it v.begin();// 将有效元素个数增加到100个多出的位置使用8填充操作期间底层会扩容// v.resize(100, 8);// reserve的作用就是改变扩容大小但不改变有效元素个数操作期间可能会引起底层容量改变// v.reserve(100);// 插入元素期间可能会引起扩容而导致原空间被释放// v.insert(v.begin(), 0);// v.push_back(8);// 给vector重新赋值可能会引起底层容量改变//v.assign(100, 8);/*出错原因以上操作都有可能会导致vector扩容也就是说vector底层原理旧空间被释放掉而在打印时it还使用的是释放之间的旧空间在对it迭代器操作时实际操作的是一块已经被释放的空间而引起代码运行时崩溃。解决方式在以上操作完成之后如果想要继续通过迭代器操作vector中的元素只需给it重新赋值即可。 */while (it ! v.end()){cout *it ;it;}cout endl;return 0; }2.指定位置元素的删除操作--erase int main() {int a[] { 1, 2, 3, 4 };vectorint v(a, a sizeof(a) / sizeof(int));// 使用find查找3所在位置的iteratorvectorint::iterator pos find(v.begin(), v.end(), 3);// 删除pos位置的数据导致pos迭代器失效。v.erase(pos);cout *pos endl; // 此处会导致非法访问return 0; } 3.与vector一样string在插入扩容操作erase之后迭代器也会失效 int main() {string s(hello);auto it s.begin();// 放开之后代码会崩溃因为resize到20会string会进行扩容// 扩容之后it指向之前旧空间已经被释放了该迭代器就失效了// 后序打印时再访问it指向的空间程序就会崩溃//s.resize(20, !);while (it ! s.end()){cout *it;it;}cout endl;it s.begin();while (it ! s.end()){it s.erase(it);// 按照下面方式写运行时程序会崩溃因为erase(it)之后// it位置的迭代器就失效了// s.erase(it);  it;}return 0; }结束语 写完啦~\(≧▽≦)/~ 接下来会愈加忙碌希望自己还能挤出时间写博客_ 感谢各位大佬的支持 求点赞收藏评论关注
http://www.dnsts.com.cn/news/37859.html

相关文章:

  • 潍坊专业做网站的公司做网站设计工资多少钱
  • 网站网页设计海报图片网站快照时间
  • 小程序建站平台国家信用信息公示系统四川
  • 自媒体营销的方式有哪些seo五大经验分享
  • 人工智能的网站网站制作公司承担
  • 江西有色建设集团有限公司网站wordpress主机404
  • 网站建设合同的注意事项wordpress自定义末班
  • 知识产权教育网站建设传统建筑网站
  • 网站建设的合同wordpress 自定义评论样式
  • 大学 英文网站建设长沙优化网站推广
  • 无法更新网站主页 dedecms都有哪些可以做app的网站
  • 阿里巴巴网站域名注册企业网银app下载
  • 微信清粉网站开发如何查询企业邮箱
  • 宇讯网站建设中国最新消息新闻
  • 系统网站建设ppt石家庄企业网站制作哪家好
  • 做网站最专业的公司网站建设视频教程网
  • 南京溧水城市建设集团网站大数据毕业后去什么岗位就业
  • 全球云邮登陆网站山东中恒建设集团网站
  • 网站wap版福州设计网站
  • 网站系统设计说明书协会网站建设需要注意什么
  • 那些网站做民宿太原网页设计师招聘信息
  • 安阳 网站建设成都双流 网站建设
  • 杭州网站排名seowordpress4.7.2 xss
  • 网站开发哪里接业务芯片商城网站建设
  • 广告传媒公司杭州seo推广优化公司
  • 西宁做网站好的公司wordpress使用手机号登录
  • 网页设计免费网站推荐苏州公司注册费用
  • 学做宝宝衣服网站好酒店网站源码
  • 天津有哪些好的做网站公司河南移动商城网站建设
  • 网站seo视频成都新津县建设网站