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

c++中vector的使用

文章目录

  • 前言
  • 1. vector 概述
    • 1.1 vector 的特点
  • 2. vector 的基本用法
    • 2.1 头文件
    • 2.2 声明和初始化
    • 2.3  访问元素
    • 2.4 修改元素
    • 2.5 修改元素
  • 3. vector 的高级用法
    • 3.1 迭代器
    • 3.2 算法与vector配合
    • 3.3 二维vector
    • 3.4 vector 的性能优化
  • 4. vector 的注意事项
  • 5. 实际应用示例
  • 总结

1. vector 概述

vector 是 C++ 标准模板库(STL)中最重要、最常用的序列式容器之一,它封装了动态大小数组的功能,提供了比原始数组更安全、更便捷的操作接口。vector 在 STL 容器家族中占据核心地位,是大多数 C++ 程序员的首选容器,vector 是 C++ 标准模板库 (STL) 中的一个序列容器,它能够动态改变大小,提供了快速的随机访问能力。vector 在内存中是连续存储的,类似于数组,但比数组更灵活。

1.1 vector 的特点

  • 动态大小:可以根据需要自动调整大小快速随机访问:支持通过下标直接访问元素

  • 内存连续:元素在内存中是连续存储的自动内存管理:自动处理内存分配和释放

2. vector 的基本用法

2.1 头文件

使用 vector 需要包含头文件:

#include <vector>

2.2 声明和初始化

// 空vector
std::vector<int> vec1;// 指定初始大小
std::vector<int> vec2(10); // 10个元素,默认值为0// 指定初始大小和值
std::vector<int> vec3(5, 100); // 5个元素,每个都是100// 使用初始化列表 (C++11)
std::vector<int> vec4 = {1, 2, 3, 4, 5};// 从数组初始化
int arr[] = {1, 2, 3};
std::vector<int> vec5(arr, arr + sizeof(arr)/sizeof(int));// 从另一个vector初始化
std::vector<int> vec6(vec4.begin(), vec4.end());

2.3  访问元素

#include<vector>
#include<iostream>
int main()
{std::vector<int> v = {10, 20, 30, 40, 50};// 使用下标访问
int a = v[2]; // 30// 使用at()访问,会进行边界检查
int b = v.at(3); // 40// 访问第一个和最后一个元素
int first = v.front(); // 10
int last = v.back();   // 50// 获取底层数组指针
int* p = v.data(); // 指向第一个元素的指针
}

2.4 修改元素

v[1] = 25;       // 修改第二个元素
v.at(2) = 35;    // 修改第三个元素

2.5 添加元素

// 在末尾添加元素
v.push_back(60);// 在指定位置插入元素
v.insert(v.begin() + 2, 15); // 在第三个位置插入15// 插入多个相同元素
v.insert(v.end(), 3, 100); // 在末尾插入3个100

2.6 删除元素

// 删除末尾元素
v.pop_back();// 删除指定位置元素
v.erase(v.begin() + 1); // 删除第二个元素// 删除指定范围的元素
v.erase(v.begin() + 1, v.begin() + 3); // 删除第二到第三个元素// 清空vector
v.clear();

​​​​​​​实际删除的是区间 [first, last),即包含 first,但不包含 last

2.7 大小和容量

// 获取元素数量
int size = v.size();// 检查是否为空
bool isEmpty = v.empty();// 获取当前容量
int capacity = v.capacity();// 改变大小
v.resize(10); // 调整为10个元素,新增元素默认初始化// 预留空间
v.reserve(100); // 预留100个元素的空间,但不改变size

reserve和resize具体的区别resize会改变size而reserve不会改变size大小

3. vector 的高级用法

3.1 迭代器

迭代器是一种行为类似指针的对象,它能够遍历容器中的元素,并允许访问这些元素。迭代器是容器和算法之间的桥梁,使得算法可以独立于容器类型工作。

std::vector<int> v = {1, 2, 3, 4, 5};// 正向迭代器
for (auto it = v.begin(); it != v.end(); ++it) {std::cout << *it << " ";
}// 反向迭代器
for (auto rit = v.rbegin(); rit != v.rend(); ++rit) {std::cout << *rit << " ";
}// 常量迭代器
for (auto cit = v.cbegin(); cit != v.cend(); ++cit) {std::cout << *cit << " ";
}

3.2 算法与vector配合

#include <algorithm>// 排序
std::sort(v.begin(), v.end());// 查找
auto it = std::find(v.begin(), v.end(), 3);
if (it != v.end()) {std::cout << "Found at position: " << it - v.begin();
}// 反转
std::reverse(v.begin(), v.end());// 删除特定元素
v.erase(std::remove(v.begin(), v.end(), 100), v.end());

3.3 二维vector

// 声明二维vector
std::vector<std::vector<int>> matrix;// 初始化5x5矩阵,初始值为0
std::vector<std::vector<int>> matrix(5, std::vector<int>(5, 0));// 访问元素
matrix[2][3] = 10;// 遍历二维vector
for (const auto& row : matrix) {for (int val : row) {std::cout << val << " ";}std::cout << std::endl;
}

3.4 vector 的性能优化

// 1. 预先分配足够空间避免多次重新分配
std::vector<int> v;
v.reserve(1000); // 预先分配空间// 2. 使用emplace_back代替push_back避免临时对象
v.emplace_back(10); // 直接在vector中构造对象// 3. 使用swap释放内存
std::vector<int>().swap(v); // 清空并释放内存// 4. 避免在vector中间频繁插入删除

4. vector 的注意事项

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

std::vector<int> v = {1, 2, 3, 4};
auto it = v.begin() + 2;
v.push_back(5); // 可能导致迭代器失效
// 此时使用it是未定义行为

  2.  越界访问:使用[]操作符不会检查边界,at()会抛出异常

5. 实际应用示例

 学生成绩管理系统

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>struct Student {std::string name;int score;
};int main() {std::vector<Student> students;// 添加学生students.push_back({"Alice", 90});students.emplace_back("Bob", 85); // 使用emplace_back更高效students.emplace_back("Charlie", 92);students.emplace_back("David", 78);// 按成绩排序std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) {return a.score > b.score;});// 计算平均分double avg = std::accumulate(students.begin(), students.end(), 0.0,[](double sum, const Student& s) {return sum + s.score;}) / students.size();// 输出结果std::cout << "Ranking:\n";for (const auto& s : students) {std::cout << s.name << ": " << s.score << "\n";}std::cout << "Average score: " << avg << "\n";return 0;
}

总结

​​​​​​​vector 是 C++ 中最常用的容器之一,它结合了数组的高效随机访问和动态大小的灵活性。掌握 vector 的使用对于编写高效、现代的 C++ 代码至关重要。在实际开发中,应根据具体需求选择合适的容器,但 vector 在大多数情况下都是一个很好的默认选择。

http://www.xdnf.cn/news/1040095.html

相关文章:

  • 前端开发中,实现多线程
  • 轮转数组题解
  • App跨平台技术2025年深度解析:核心原理与最佳实践
  • C语言环形数组(循环队列)详解:原理、实现与应用
  • BeckHoff <--> Festo Cmmt AS驱动器 EtherCat通讯
  • 1.16 Cookie 和 Session
  • 多商户商城+直播电商系统融合开发方案:一套源码搞定双场景应用
  • 解决vue3标签中引用动态图片失效问题
  • Python无限弹窗
  • CSS Margin纵向重叠(Margin Collapse)问题详解
  • springAI 大模型应用开发
  • 操作系统多级存储模型
  • 【AS32系列MCU调试教程】调试工具:Eclipse调试工具栏与窗口的深入分析
  • 《高等数学》(同济大学·第7版)第五章第一节定积分的概念与性质
  • 【多线程初阶】详解线程池(上)
  • 探险之物资储备c++
  • 多项目状态如何集中监控与汇总
  • uni-app项目实战笔记12--创建分类列表完成页面跳转
  • 解决在微信小程序中view组件下的text和images设置了样式display: flex; align-items: center;对不齐
  • layui在首页添加弹窗和跳转页面
  • Leetcode 398. 随机数索引
  • 设计师灵感仓库!IconViewer 右键一键提取系统图标,PNG 透明背景素材随取随用
  • Lyapunov深度强化学习移动边缘计算网络在线计算卸载python
  • MVVM模式中,BaseViewModel 的 IsBusy 属性的作用
  • Hexo-butterfly友情链接页面优化
  • 【Linux】进程优先级和切换调度
  • 【软测】脚本实现 - 网页自动化测试
  • linux-压缩类命令
  • 黑马教程强化day3-1
  • 2025虚幻引擎一般用什么模型格式