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

樟木头网站网络安全维护公司

樟木头网站,网络安全维护公司,闲鱼钓鱼网站怎么制作,英文网站建站文章目录一、vector概述1.1 vector的定义1.2 vector的核心特性二、vector的基本使用2.1 头文件与命名空间2.2 vector的构造函数三、vector的常用操作3.1 元素访问3.2 容量操作3.3 修改操作四、vector的迭代器五、vector的性能优化5.1 预分配空间5.2 使用emplace_back替代push_b…

文章目录

  • 一、vector概述
    • 1.1 vector的定义
    • 1.2 vector的核心特性
  • 二、vector的基本使用
    • 2.1 头文件与命名空间
    • 2.2 vector的构造函数
  • 三、vector的常用操作
    • 3.1 元素访问
    • 3.2 容量操作
    • 3.3 修改操作
  • 四、vector的迭代器
  • 五、vector的性能优化
    • 5.1 预分配空间
    • 5.2 使用emplace_back替代push_back
  • 六、vector的迭代器失效问题
    • 6.1 迭代器会失效的情况归纳
    • 6.2 如何避免迭代器失效
  • 七、vector的适用场景
    • 7.1 适合使用vector的场景
    • 7.2 不适合使用vector的场景

作为C++开发者,vector是我们日常编程中使用频率最高的容器之一。它结合了数组的高效访问和动态扩容的灵活性,是STL中最受欢迎的序列式容器。本文将全面剖析vector的方方面面,帮助读者彻底掌握这个强大的工具。

一、vector概述

1.1 vector的定义

  • vector是C++标准模板库(STL)中的一个动态数组容器,它能够存储相同类型的元素,并且可以动态调整大小。与普通数组相比,vector的最大优势在于它能够根据需要自动扩容,无需手动管理内存。

1.2 vector的核心特性

  • 动态扩容:自动调整容量以适应元素数量的变化

  • 随机访问:支持通过下标直接访问元素,时间复杂度O(1)

  • 内存连续:所有元素存储在连续的内存空间中

  • 尾部操作高效:在尾部插入和删除元素效率高

  • 丰富的接口:提供大量便捷的操作方法

二、vector的基本使用

2.1 头文件与命名空间

  • 使用vector需要包含头文件:
#include <vector>
  • vector位于std命名空间中,通常我们使用:
using namespace std;

2.2 vector的构造函数

vector提供了多种构造方式:

    1. 默认构造(空vector)
vector<int> v1;
    1. 指定大小和初始值
vector<int> v2(5, 10); // 5个元素,每个都是10
    1. 通过迭代器范围构造
int arr[] = {1, 2, 3};
vector<int> v3(arr, arr + 3);
    1. 拷贝构造
vector<int> v4(v3);
    1. C++11初始化列表
vector<int> v5 = {1, 2, 3, 4, 5};

三、vector的常用操作

3.1 元素访问

vector提供了多种访问元素的方式:

我们定义初始化一个vector作为示例:

vector<int> v = {1, 2, 3, 4, 5};
    1. 使用下标操作符[](不检查边界)
cout << v[0] << endl; // 1
    1. 使用at()方法(会检查边界,越界抛出异常)
cout << v.at(1) << endl; // 2
    1. 访问首尾元素
cout << v.front() << endl; // 1
cout << v.back() << endl;  // 5
    1. 使用迭代器访问
for(auto it = v.begin(); it != v.end(); ++it) {cout << *it << " ";
}

3.2 容量操作

声明一个vector作为示例:

vector<int> v;
    1. 获取元素数量
cout << v.size() << endl;
    1. 获取当前容量
cout << v.capacity() << endl;
    1. 检查是否为空
if(v.empty()) {cout << "vector is empty" << endl;
}
    1. 改变元素数量
v.resize(10); // 将size调整为10
    1. 预留空间(重要优化手段)
v.reserve(100); // 预先分配100个元素的空间

3.3 修改操作

老样子,声明一个vector作为示例:

vector<int> v;- 1. 尾部插入
```cpp
v.push_back(1);
v.push_back(2);- 2.C++11更高效的emplace_back
```cpp
v.emplace_back(3); 
    1. 尾部删除
v.pop_back();
    1. 任意位置插入
v.insert(v.begin() + 1, 5); // 在第二个位置插入5
    1. 任意位置删除
v.erase(v.begin()); // 删除第一个元素
    1. 清空vector
v.clear();
    1. 交换两个vector
vector<int> v2 = {4, 5, 6};
v.swap(v2);

四、vector的迭代器

vector支持多种迭代器,使得遍历操作更加灵活:

  • 定义一个vector容器作为示例:
vector<int> v = {1, 2, 3, 4, 5};
    1. 普通迭代器(正向遍历)
for(auto it = v.begin(); it != v.end(); ++it) {cout << *it << " ";
}
    1. 常量迭代器(不允许修改元素)
for(auto it = v.cbegin(); it != v.cend(); ++it) {cout << *it << " ";
}
    1. 反向迭代器(逆向遍历)
for(auto rit = v.rbegin(); rit != v.rend(); ++rit) {cout << *rit << " ";
}

五、vector的性能优化

5.1 预分配空间

  • vector的自动扩容机制虽然方便,但频繁扩容会影响性能。使用reserve()可以显著提高性能:
vector<int> v;
v.reserve(1000); // 预先分配1000个元素的空间// 现在插入1000个元素不会触发扩容
for(int i = 0; i < 1000; ++i) {v.push_back(i);
}

5.2 使用emplace_back替代push_back

  • C++11引入的emplace_back比push_back更高效,特别是对于复杂对象:
vector<pair<int, string>> v;// push_back需要构造临时对象
v.push_back(make_pair(1, "one"));// emplace_back直接在容器中构造对象
v.emplace_back(2, "two");

六、vector的迭代器失效问题

6.1 迭代器会失效的情况归纳

  • 插入操作:

    • 如果导致vector扩容,所有迭代器失效

    • 否则,插入位置之后的迭代器失效

  • 删除操作:

    • 被删除元素及其后的所有迭代器失效

6.2 如何避免迭代器失效

  • 正确做法1:使用erase返回值更新迭代器
for(auto it = v.begin(); it != v.end(); ) {if(*it == 3) {it = v.erase(it); // erase返回下一个有效迭代器} else {++it;}
}
  • 正确做法2:使用算法+erase
v.erase(remove(v.begin(), v.end(), 3), v.end());

七、vector的适用场景

7.1 适合使用vector的场景

  • 需要频繁随机访问元素

  • 主要在尾部进行插入删除操作

  • 元素数量变化不大或可以预估最大数量

  • 需要内存连续性的场景(如与C API交互)

7.2 不适合使用vector的场景

  • 需要频繁在头部或中间插入删除

  • 元素数量变化非常大且无法预估

  • 对内存使用有严格限制的场景

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

相关文章:

  • 【EE初阶 - 网络原理】网络通信
  • 方案网站有哪些盗用别的公司网站模块
  • 做网站是否要去工商备案做网站群
  • Less resolver error:‘~antd/es/style/themes/index.less‘ wasn‘t found.
  • php网站验证码错误网站改版对用户的影响
  • vue中如何实现异步加载组件
  • 网站地图seo石城网站建设
  • 怎么防止网站被镜像wordpress seo 主题
  • 那些钓鱼网站是怎么做的页面设计上边距在哪里找
  • 中国移动idc建设网站wordpress 导航栏
  • @RequestBody与@PathVariable什么时候加
  • 2011 年真题配套词汇单词笔记(考研真相)
  • “AMQP协议深度解析:消息队列背后的通信魔法”之核心概念与SpringBoot落地实战
  • 网规答题点【summer解析】华为5G空口新技术有F-OFDM和SCMA,F-OFDM是基于OFDM的改进版本,可以 实现空口物理层分片,兼容LTE 4G。
  • 简约智能设备制造公司网站今天东营发生的重大新闻
  • Matrixport DAT与XBIT携DEX赋能生态,共赴新加坡TOKEN2049
  • 做网站需要什么营业执照中国建设企业协会网站首页
  • 微服务项目->在线oj系统(Java-Spring)--增删改(前端)
  • 软件网站开发评估免费拿货的代理商
  • C#基础05-控制语句
  • 网站域名过期还能用吗wordpress主题管理插件
  • 扩展BaseMapper类
  • 秦皇岛建设部网站工程建设信息都在哪个网站发布
  • 多模态分类:图文结合的智能识别与代码实战
  • UE5 - C++项目基础
  • Word和WPS文字表格内的文字无法垂直居中?这样设置
  • 平台设计网站公司电话号码网站建设最好用什么语言
  • 【数组倍数去重】2022-11-26
  • vite插件的使用
  • 惠州网站建设是什么渠道查官网