c++ std::vector使用笔记

news/2025/2/24 4:27:10

std::vector 是 C++ 标准库中的一个动态数组容器,提供了丰富的接口来管理容量、插入、删除和访问元素。以下是对你提到的接口的详细说明和使用示例:

1. 容量相关接口

  • capacity(): 返回当前 vector 分配的存储空间大小(以元素数量计),即在不重新分配内存的情况下可以容纳的元素数量。

    std::vector<int> vec;
    vec.reserve(100);  // 预留 100 个元素的空间
    std::cout << "Capacity: " << vec.capacity() << std::endl;  // 输出: Capacity: 100
    
  • reserve(size_type n): 预留至少能容纳 n 个元素的内存空间。如果 n 大于当前容量,vector 会重新分配内存以增加容量。

    std::vector<int> vec;
    vec.reserve(100);  // 预留 100 个元素的空间
    
  • shrink_to_fit(): 请求移除未使用的容量,使 capacity() 等于 size()。这个请求是非强制的,具体实现可能会忽略。

    std::vector<int> vec(100);
    vec.resize(10);  // 缩小 size 到 10
    vec.shrink_to_fit();  // 请求缩小容量
    std::cout << "Capacity after shrink: " << vec.capacity() << std::endl;  // 输出: Capacity after shrink: 10
    

2. 附加元素接口

  • push_back(const T& value): 在 vector 的末尾添加一个元素。

    std::vector<int> vec;
    vec.push_back(10);  // vec: [10]
    vec.push_back(20);  // vec: [10, 20]
    
  • emplace_back(Args&&... args): 在 vector 的末尾就地构造一个元素,避免了不必要的拷贝或移动操作。

    std::vector<std::string> vec;
    vec.emplace_back("Hello");  // vec: ["Hello"]
    vec.emplace_back("World");  // vec: ["Hello", "World"]
    

3. 元素插入接口

  • insert(iterator pos, const T& value): 在指定位置 pos 前插入一个元素。

    std::vector<int> vec = {1, 3};
    vec.insert(vec.begin() + 1, 2);  // vec: [1, 2, 3]
    
  • emplace(iterator pos, Args&&... args): 在指定位置 pos 前就地构造一个元素。

    std::vector<std::string> vec = {"Hello", "World"};
    vec.emplace(vec.begin() + 1, "C++");  // vec: ["Hello", "C++", "World"]
    

4. 元素删除接口

  • pop_back(): 删除 vector 的最后一个元素。

    std::vector<int> vec = {1, 2, 3};
    vec.pop_back();  // vec: [1, 2]
    
  • erase(iterator pos): 删除指定位置 pos 的元素。

    std::vector<int> vec = {1, 2, 3};
    vec.erase(vec.begin() + 1);  // vec: [1, 3]
    
  • erase(iterator first, iterator last): 删除范围 [first, last) 内的元素。

    std::vector<int> vec = {1, 2, 3, 4};
    vec.erase(vec.begin() + 1, vec.begin() + 3);  // vec: [1, 4]
    
  • clear(): 清空 vector 中的所有元素。

    std::vector<int> vec = {1, 2, 3};
    vec.clear();  // vec: []
    

5. 元素访问接口

  • operator[]: 通过下标访问元素,不进行边界检查。

    std::vector<int> vec = {1, 2, 3};
    int x = vec[1];  // x = 2
    
  • at(size_type pos): 通过下标访问元素,进行边界检查,如果 pos 超出范围则抛出 std::out_of_range 异常。

    std::vector<int> vec = {1, 2, 3};
    int x = vec.at(1);  // x = 2
    
  • front(): 返回 vector 的第一个元素。

    std::vector<int> vec = {1, 2, 3};
    int x = vec.front();  // x = 1
    
  • back(): 返回 vector 的最后一个元素。

    std::vector<int> vec = {1, 2, 3};
    int x = vec.back();  // x = 3
    
  • data(): 返回指向 vector 内部数组的指针。

    std::vector<int> vec = {1, 2, 3};
    int* p = vec.data();  // p 指向 vec 的内部数组
    

6. 容量相关

  • empty(): 判断 vector 是否为空。

    std::vector<int> vec;
    if (vec.empty()) {
        std::cout << "Vector is empty" << std::endl;
    }
    
  • size(): 返回 vector 中当前元素的数量。

    std::vector<int> vec = {1, 2, 3};
    std::cout << "Size: " << vec.size() << std::endl;  // 输出: Size: 3
    
  • max_size(): 返回 vector 可以容纳的最大元素数量。

    std::vector<int> vec;
    std::cout << "Max size: " << vec.max_size() << std::endl;
    

总结

std::vector 提供了丰富的接口来管理动态数组的容量、插入、删除和访问元素。合理使用这些接口可以有效地管理内存并提高代码的性能。


http://www.niftyadmin.cn/n/5863966.html

相关文章

用Python实现Excel数据同步到飞书文档

目录 一、整体目标 二、代码结构拆解 三、核心逻辑讲解&#xff08;重点&#xff09; 1. 建立安全连接&#xff08;获取access_token&#xff09; 2. 定位文档位置 3. 数据包装与投递 四、异常处理机制 五、函数讲解 get_access_token() 关键概念解释 1. 飞书API访问…

在虚拟机中搭建Spark学习环境的完整指南

在大数据处理领域&#xff0c;Apache Spark作为一种强大的开源数据处理框架&#xff0c;因其高效性和灵活性而备受开发者青睐。为了更好地学习和实践Spark&#xff0c;许多初学者会选择在虚拟机中搭建Spark环境。本文将详细介绍如何在虚拟机中创建并配置Spark环境&#xff0c;从…

Oracle JDK、Open JDK zulu下载地址

一、Oracle JDK https://www.oracle.com/java/technologies/downloads/ 刚进去是最新的版本&#xff0c;往下滑可以看到老版本 二、Open JDK的 Azul Zulu https://www.azul.com/downloads/ 直接可以选版本等选项卡

某生产制造集团管理流程优化项目成功案例纪实

某生产制造集团管理流程优化项目成功案例纪实 ——打造数智化管理新体验&#xff0c;实现组织效率的飞跃 【客户行业】生产制造 【问题类型】流程管理 【客户背景】 某生产制造集团专注于高精度机械部件的研发与生产&#xff0c;服务于航空、汽车、医疗设备等多个高端制造…

tortoiseGit的使用和上传拉取

tortoiseGit的使用和上传拉取 下载TortoiseGit 通过网盘分享的文件&#xff1a;tortoiseGit.zip 链接: https://pan.baidu.com/s/1EOT_UsM9_OysRqXa8gES4A?pwd1234 提取码: 1234 在电脑桌面新建文件夹并进入 右击鼠标 将网址复制上去 用户名和密码是在git注册的用户名和…

【MyBatis】#{} 与 ${} 的区别(常见面试题)

目录 前言 预编译SQL和即时SQL 什么是预编译SQL&#xff1f; 什么是即时SQL&#xff1f; 区别 #{} 与 ${}的使用 防止SQL注入 什么是SQL注入&#xff1f; 原理 排序功能 模糊查询 总结#{}和${}的区别 前言 在前面的学习中&#xff0c;我们已经知道了如果SQL语句想…

draw.io:开源款白板/图表绘制利器

在工作和学习中&#xff0c;我们常常需要绘制各种图表&#xff0c;例如流程图、思维导图、网络拓扑图等等。一款功能强大且易于上手的图表绘制工具可以极大地提高我们的效率。今天&#xff0c;我要向大家推荐一款开源免费的图表绘制工具—— draw.io&#xff0c;并手把手教你如…

Linux 系统中的软链接与硬链接

目录 一、什么是软链接&#xff1f; 1. 创建软链接 2. 软链接的特性 3. 软链接的用途 二、什么是硬链接&#xff1f; 1. 创建硬链接 2. 硬链接的特性 3. 硬链接的用途 4. 目录硬链接的特殊性 ​编辑 三、软链接与硬链接的区别 1. inode 编号 2. 路径依赖 3. 删除行…