当前位置: 首页 > 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.dtcms.com/a/250691.html

相关文章:

  • 性能测试详解
  • Java面向对象this关键字和static关键字
  • 【LUT技术专题】4DLUT代码讲解
  • 单测时如何让 mock 的接口在长链路调用时一直生效
  • XCTF-misc-base64÷4
  • [直播推流] 编译 librtmp 库
  • cannot allocate memory in static TLS block昇腾910报错
  • 详解智能指针
  • 会计 - 财务报告
  • IO之详解cin(c++IO关键理解)
  • Java基础复习之static
  • 【数据集成与ETL 04】dbt实战指南:现代化数据转换与SQL代码管理最佳实践
  • 修改Typora快捷键
  • XCTF-misc-Test-flag-please-ignore
  • 【redis——缓存雪崩(Cache Avalanche)】
  • 实习记录1
  • wpa_supplicant:无线网络连接的“智能管家”
  • cpu微码大全 微码添加工具 八九代cpu针脚屏蔽图
  • 17_Flask部署到网络服务器
  • Vue3中v-bind=“$attrs“用法讲解
  • 人工智能学习25-BP代价函数
  • 计网复习知识(16)传输层及其协议功能
  • SCADE Suite / Scade 6 官方参考材料介绍
  • 无监督的预训练和有监督任务的微调
  • PH热榜 | 2025-06-14
  • 附录:对于头结点单向链表的优化方法
  • 关于钉钉的三方登录
  • Trino权威指南
  • 深入解析ReentrantReadWriteLock读写锁机制
  • 插入点(position) 和对齐点(AlignmentPoint)详解——CAD c#二次开发