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

asp网站建设实例花网站广州住房和城乡建设厅网站

asp网站建设实例花网站,广州住房和城乡建设厅网站,邯郸市民网,微信视频网站建设多少钱引言 亲爱的小伙伴们,今天我要和大家分享一个C编程中的"神器"——vector容器!作为STL(标准模板库)中最常用的容器之一,vector就像是一个"超级数组",既有数组的高效随机访问特性&#…

引言

亲爱的小伙伴们,今天我要和大家分享一个C++编程中的"神器"——vector容器!作为STL(标准模板库)中最常用的容器之一,vector就像是一个"超级数组",既有数组的高效随机访问特性,又能自动调整大小,让你告别固定大小数组的困扰。不管你是刚接触C++的新手,还是想深入理解vector实现原理的老手,这篇博客都能带给你新的收获!

一、什么是vector?

想象一下,你正在收集各种小玩具,但不确定最终会有多少个。用普通数组的话,你得提前决定一个上限,太小了不够用,太大了又浪费空间。这时候,vector就像一个神奇的收纳盒,它能根据你放入的玩具数量自动调整大小!

定义与特点

  • 动态数组:vector是一个能够存放任意类型的动态数组
  • 连续内存:vector中的元素在内存中连续存储,支持高效的随机访问
  • 自动扩容:当空间不足时,vector会自动分配更大的内存空间
  • 类型安全:通过模板机制确保类型安全

vector的内部结构

从实现原理上看,vector内部维护三个关键指针:

指向数据的起始位置 —— start

指向最后一个元素的下一个位置 —— finish

指向分配的内存空间的尾端 —— end_of_storage

!vector内部结构示意图

这就像一个能伸缩的宿舍:

  • start是宿舍的门口
  • finish是最后一名同学睡的床位后面一点的位置
  • end_of_storage是宿舍的墙壁(容量上限)

二、vector的基本操作

创建vector

#include <vector>// 创建空vectorstd::vector<int> vec1;// 创建包含5个元素的vector,所有元素初始化为0std::vector<int> vec2(5);// 创建包含5个元素的vector,所有元素初始化为10std::vector<int> vec3(5, 10);// 使用初始化列表(C++11)std::vector<int> vec4 = {1, 2, 3, 4, 5};// 从数组创建vectorint arr[] = {1, 2, 3, 4, 5};std::vector<int> vec5(arr, arr + 5);// 从另一个vector创建std::vector<int> vec6(vec5);

这就像不同的方式开party:可以先空着等人来(vec1),可以先邀请5个人(vec2),可以先邀请5个特定的朋友(vec3)...

添加和删除元素


std::vector<int> vec;// 在尾部添加元素vec.push_back(10);  // 添加元素10到尾部// 在指定位置插入元素vec.insert(vec.begin() + 1, 20);  // 在第二个位置插入20// 删除尾部元素vec.pop_back();// 删除指定位置的元素vec.erase(vec.begin() + 1);  // 删除第二个元素// 清空所有元素vec.clear();

想象一下排队买票:

  • push_back是有人来排队,自动站到队尾
  • insert是有人插队到指定位置
  • pop_back是最后一个人不想排了,离开了
  • erase是队伍中间某个人离开了
  • clear是突然下大雨,所有人都散了

访问元素

std::vector<int> vec = {10, 20, 30, 40, 50};// 使用索引访问int a = vec[2];  // 获取索引为2的元素(30)// 使用at函数(带边界检查)int b = vec.at(3);  // 获取索引为3的元素(40),越界会抛出异常// 获取第一个和最后一个元素int first = vec.front();  // 获取第一个元素(10)int last = vec.back();    // 获取最后一个元素(50)

这就像找教室里的同学:直接叫号(索引)、点名确认(at)、找第一个和最后一个。

三、vector的容量管理

理解vector的容量管理是掌握其高效使用的关键。

size与capacity

  • size:当前vector中实际元素的个数
  • capacity:当前vector在不扩容的情况下最多能容纳的元素个数

std::vector<int> vec;for(int i = 0; i < 10; i++) {vec.push_back(i);std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;}

可能的输出结果:

Size: 1, Capacity: 1Size: 2, Capacity: 2Size: 3, Capacity: 4Size: 4, Capacity: 4Size: 5, Capacity: 8Size: 6, Capacity: 8Size: 7, Capacity: 8Size: 8, Capacity: 8Size: 9, Capacity: 16Size: 10, Capacity: 16

这就像一个聚会场地:

  • size是实际到场的人数
  • capacity是场地能容纳的最大人数
  • 当人数超过容量时,需要换一个更大的场地

扩容原理

当vector需要更多空间时:

  1. 分配一块更大的内存(通常是当前容量的1.5倍或2倍)
  1. 将现有元素复制到新内存
  1. 释放旧内存
  1. 更新内部指针

这个过程叫做重新分配(reallocation),它是耗时的操作,因为需要复制所有元素。

优化容量管理

// 预留空间,避免频繁扩容vec.reserve(1000);  // 预分配至少能容纳1000个元素的空间// 调整大小(会改变size)vec.resize(100);    // 调整为100个元素,如果扩大则用默认值填充// 减少容量以适应当前大小vec.shrink_to_fit();  // C++11引入
  • reserve是提前租一个足够大的场地,避免中途换场地
  • resize是主动调整聚会人数
  • shrink_to_fit是在人到齐后,换一个刚好够用的小场地,节省费用

四、vector的迭代器

迭代器是访问容器元素的统一接口,就像"智能指针"。

std::vector<int> vec = {10, 20, 30, 40, 50};// 使用迭代器遍历for(std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";  // 输出:10 20 30 40 50}// C++11引入的范围for循环(语法糖)for(auto& element : vec) {std::cout << element << " ";  // 输出同上}// 反向迭代器for(std::vector<int>::reverse_iterator rit = vec.rbegin(); rit != vec.rend(); ++rit) {std::cout << *rit << " ";  // 输出:50 40 30 20 10}

这就像参观博物馆:

  • 普通迭代器是从入口到出口的参观路线
  • 反向迭代器是从出口回到入口的路线
  • 范围for循环就是跟着导游走,不用担心路线

五、vector的常见陷阱与优化

1. 迭代器失效问题

当vector扩容或删除元素时,迭代器可能会失效:

std::vector<int> vec = {1, 2, 3, 4, 5};auto it = vec.begin() + 2;  // 指向元素3vec.insert(vec.begin(), 0);  // 可能导致扩容// 此时it已失效,使用it将导致未定义行为

解决方法:在可能导致迭代器失效的操作后,重新获取迭代器。

2. 不必要的复制

// 低效的循环添加元素std::vector<int> vec;for(int i = 0; i < 10000; i++) {vec.push_back(i);  // 可能多次扩容}// 优化:预先分配足够空间std::vector<int> vec2;vec2.reserve(10000);  // 提前分配空间for(int i = 0; i < 10000; i++) {vec2.push_back(i);  // 避免扩容}

3. 返回值优化

// 避免不必要的复制void processVector(const std::vector<int>& vec) {// 使用const引用作为参数}std::vector<int> createVector() {std::vector<int> result = {1, 2, 3};return result;  // 编译器会优化,避免不必要的复制}

六、实际应用案例

案例1:动态二维数组

// 创建10x20的二维数组std::vector<std::vector<int>> matrix(10, std::vector<int>(20, 0));// 访问元素matrix[5][10] = 100;// 动态调整行数matrix.resize(15);  // 现在是15x20

案例2:高效字符串分割

std::vector<std::string> split(const std::string& str, char delimiter) {std::vector<std::string> tokens;std::string token;std::istringstream tokenStream(str);while (std::getline(tokenStream, token, delimiter)) {tokens.push_back(token);}return tokens;}

案例3:自定义对象的存储

struct Student {std::string name;int age;Student(const std::string& n, int a) : name(n), age(a) {}};std::vector<Student> students;students.push_back(Student("小明", 18));students.push_back(Student("小红", 17));// C++11的emplace_back可以在容器内直接构造对象,避免复制students.emplace_back("小刚", 19);

总结

vector是C++中最常用的容器之一,它提供了数组的高效随机访问,又克服了数组大小固定的限制。通过深入理解vector的工作原理,你可以更高效地使用它,避免常见陷阱,写出更优雅高效的代码。

记住:合理使用reserve预分配空间、避免不必要的复制、注意迭代器失效问题,这些都是使用vector的关键技巧!

在下一篇博客中,我们将更深入地探讨vector的内存管理机制和更多高级用法。敬请期待!

http://www.dtcms.com/a/537509.html

相关文章:

  • 实时视频接入技术解析
  • 做优化的网站电话wordpress 5.0.2 发布失败
  • 商城建设公司湖南好搜公司seo
  • 在 Windows系统下将 YOLOv5 模型导出为 ONNX 文件
  • 数字化利器,扔掉getdata吧
  • 个人网站建设价格表wordpress post class
  • 做网站写代码好还是模板c 网站开发视频教程
  • 粉末涂料 技术支持 东莞网站建设建设网站困难的解决办法
  • 网站开发工程师岗位说明书移动网站建设cnfg
  • linxu下安装纯cpu模式的pytorch以及国内源安装方法
  • C++ 常见代码异味(Code Smells)
  • 手写线程池第2弹:并发与并行深度解析:从CPU原理到高并发系统设计的核心技术
  • 国产三维CAD实现复杂实体快速转换钣金 | 中望3D 2026亮点速递(9)
  • 免费网站建设专业的公司软件设计师教程
  • 关于企业的网站wordpress建站seo
  • Java数据结构:Stack(栈)Queue(队列)
  • Python中的列表推导式、字典推导式和集合推导式的性能和应用场景?
  • Spring全家桶面试题, 只补充细节版本
  • 做网站可以挣钱吗微信公众平台网页版登录
  • 第2章-类加载子系统
  • 网站左侧悬浮导航芜湖学校网站建设电话
  • PyTorch2 Python深度学习 - 简介以及入门
  • 定制版网站建设费用湘潭网站建设湘潭振企专业
  • 自己做的小网站如何发布网络营销案例范文
  • 单体架构中的事件驱动架构:Java应用程序的渐进式重构
  • 成都网站开发的公司吉安县规划建设局网站
  • 有了域名怎么建设网站淘宝客网站是怎么做的
  • 铁岭做网站大学网页设计与制作教程
  • 工商工事上哪个网站做西安网站制作公司排名
  • 机关单位网站建设申请公司简介模板图片