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

C++STL---vector常见用法

C++ STL中的vector

vector是C++标准模板库(STL)中最常用的序列容器之一,它是一个动态数组,能够存储任意类型的对象(如整数、字符串等)。vector的主要优点是提供了快速的随机访问,同时还能够动态地调整大小。

基本操作
  1. 创建和初始化

    #include <vector>
    std::vector<int> v1; // 创建一个空的vector
    std::vector<int> v2(5, 10); // 创建一个大小为5的vector,每个元素初始化为10
    std::vector<int> v3 = {1, 2, 3, 4, 5}; // 初始化列表
    
  2. 访问元素

    • at(index)operator[]:访问指定位置的元素,at会检查索引范围。
    • front()back():访问第一个和最后一个元素。
    int first = v3.front(); // 1
    int last = v3.back(); // 5
    int element = v3.at(2); // 3
    
  3. 修改元素

    • push_back(value):在vector的末尾添加一个元素。
    • pop_back():移除vector的最后一个元素。
    • insert(position, value):在指定位置插入一个元素。
    • erase(position)erase(start, end):删除一个或多个元素。
    • clear():清空所有元素。
    v3.push_back(6); // v3: {1, 2, 3, 4, 5, 6}
    v3.pop_back(); // v3: {1, 2, 3, 4, 5}
    v3.insert(v3.begin() + 2, 99); // v3: {1, 2, 99, 3, 4, 5}
    v3.erase(v3.begin() + 2); // v3: {1, 2, 3, 4, 5}
    
  4. 大小和容量

    • size():返回当前元素的数量。
    • capacity():返回vector在不重新分配内存的情况下可以存储的元素数量。
    • resize(n):改变vector的大小,多出的元素会被初始化。
    • reserve(n):增加vector的容量。
    size_t num_elements = v3.size(); // 5
    size_t capacity = v3.capacity();
    v3.reserve(10);
    
  5. 遍历

    • 使用范围for循环或迭代器。
    for (int x : v3) std::cout << x << " ";
    for (auto it = v3.begin(); it != v3.end(); ++it) std::cout << *it << " ";
    
相关算法

vector可以与STL中的算法库配合使用,提供强大的数据处理能力。

  1. 排序

    #include <algorithm>
    std::sort(v3.begin(), v3.end()); // 默认升序排序
    
  2. 查找

    auto it = std::find(v3.begin(), v3.end(), 3);
    if (it != v3.end()) {std::cout << "Element found: " << *it << std::endl;
    }
    
  3. 计数

    int count = std::count(v3.begin(), v3.end(), 3);
    
  4. 删除特定元素

    v3.erase(std::remove(v3.begin(), v3.end(), 3), v3.end());
    
  5. 遍历并执行操作

    std::for_each(v3.begin(), v3.end(), [](int& x){ x *= 2; });
    

删除特定元素代码是C++中使用的一种常见技术,结合了std::remove算法和erase成员函数来从容器中删除特定的元素。这种技术通常被称为“擦除-删除”惯用法(Erase-Remove Idiom)。下面是详细解释:

分解代码

d3.erase(std::remove(d3.begin(), d3.end(), 3), d3.end());
  1. std::remove(d3.begin(), d3.end(), 3)

    • std::remove是一个算法,它接受三个参数:开始迭代器、结束迭代器和要删除的值(这里是3)。
    • 这个函数并不实际从容器中删除元素,而是将不等于3的元素向容器的开始位置移动,并返回一个新的迭代器,指向移动后容器中最后一个有效元素之后的位置。
    • 也就是说,所有的3都被移到了容器的末尾,并且函数返回了一个指向第一个3的迭代器。
  2. d3.erase(new_end, d3.end())

    • erase是一个成员函数,用于从容器中实际删除元素。它接受两个迭代器作为参数:要删除的元素范围的开始和结束。
    • 在这里,erase函数使用从std::remove返回的迭代器(指向第一个3)作为起始位置,到容器的结束位置d3.end()作为结束位置。
    • 这个调用将删除所有的3,因为这些3现在都位于这个范围内。

效果

这行代码的效果是从容器d3中删除所有值为3的元素。这种方法比单独使用循环和条件删除更高效,因为它只需要一次遍历和少量的元素移动。

注意

  • 这种方法适用于支持快速随机访问的容器,如vectordequearray等。对于listforward_list这类容器,应使用成员函数remove,因为它们提供了更为优化的删除操作。
  • 使用std::remove时,容器的大小不会改变,只是元素的位置发生了变化,因此需要与erase结合使用来实际减少容器的大小。
http://www.lryc.cn/news/360681.html

相关文章:

  • linux文件共享之samba
  • 端午传统食品创意营销方案
  • 制作ChatPDF之Elasticsearch8.13.4搭建(一)
  • 一种最大重叠离散小波包特征提取和支持向量机的ECG心电信号分类方法(MATLAB 2018)
  • 德勤:中国、印度等对ChatGPT等生成式AI应用,处领先地位
  • 开发靠谱心得
  • 【OpenHarmony】TypeScript 语法 ④ ( 函数 | TypeScript 具名函数和匿名函数 | 可选参数 | 剩余参数 | 箭头参数 )
  • 嵌入式工程师人生提质的十大成长型思维分享
  • 名下企业查询,清晰明了;在线操作,方便快捷
  • 图书推荐:ChatGPT专业知识信息课程
  • Java项目:94 springboot大学城水电管理系统
  • Unity内制作动画
  • Java中的JDBC如何连接数据库并执行操作
  • webserver服务器从零搭建到上线(六)|Timestamp类和InetAddress类
  • 【Java】一文看懂Thread 线程池的 7 种创建方式、任务队列及自定义线程池(代码示例)
  • 【SpringBoot】四种读取 Spring Boot 项目中 jar 包中的 resources 目录下的文件
  • 掌控未来,爱普生SR3225SAA用于汽车钥匙、射频电路的智慧引擎
  • 第五届武汉纺织大学ACM程序设计竞赛 个人题解(待补完)
  • LeetCode---哈希表
  • Python知识点13---面向对象的编程
  • Android Dialog软键盘弹出问题完美解决办法
  • 【C++】C++入门1.0
  • springboot实现文件上传功能,整合云服务
  • 接口interfance的基本使用
  • Gitlub如何删除分支(删除远程分支+本地分支)
  • 使用RSA算法加密字符串:从基础到实现 - Python
  • MFC实现守护进程,包括开机自启动、进程单例、进程查询、进程等待、重启进程、关闭进程
  • Spark SQL数据源 - Parquet文件
  • eNsp——两台电脑通过一根网线直连通信
  • 杂牌记录仪TS视频流恢复方法