C++ 迭代器的设计与使用

news2024/11/24 9:11:42
  • C++ 迭代器是一种用于访问容器(例如数组、向量、列表等)元素的工具。它们允许我们以一种统一的方式遍历和操作容器中的数据,而不用关心容器内部数据结构的细节

C++ 迭代器

std 重要函数

  • std::begin  和  std::end
  • std::advance(iter,n)向前移动
  • std::distance(one,two) 计算两个迭代器之间的距离
  • std::next 和  std::prev 用于获取给定迭代器的下一个或上一个迭代器
  • std::copy   用于将一个容器的元素复制到另一个容器中
  • std::fiind 用于在容器中查找指定的值,并返回找到的第一个匹配元素的迭代器
  • std::sort  用于对容器中的元素进行排序
    • 默认使用升序排序
    • std::greater<int>()
  • std::reverse 用于反转容器中元素的顺序

next

  • 对于任何可迭代的容器,它都支持至少以下两个基本操作:
    • begin()返回指向容器中第一个元素的迭代器
    • end()返回指向容器中最后一个元素之后位置的迭代器
  • next 是一个标准库函数,它接受一个迭代器作为参数,并返回一个新的迭代器,该迭代器指向参数迭代器之后的位置。而++迭代器则将迭代器引用自身向前移动一个位置

sort 

  • std::sort(numbers.begin(), numbers.end());

  •  std::sort(numbers.begin(), numbers.end(), std::greater<int>());

 

C++ 迭代器与 vector

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    std::cout << "P seq:" << std::endl;
    for (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) 
    {
        std::cout << *it << " " << std::endl;
    }

    std::cout << "N seq:" << std::endl;
    for (std::vector<int>::reverse_iterator rit = numbers.rbegin(); rit != numbers.rend(); ++rit) 
    {
        std::cout << *rit << " " << std::endl;
    }

    return 0;
}

  • example
#include <iostream>
#include <vector>

int main() {
    std::vector<int> nums = { 1, 2, 3, 4, 5 };

    std::vector<int>::iterator it = nums.begin();
    std::vector<int>::iterator endIt = nums.end();

    while (it != endIt) 
    {
        std::cout << *it << " ";
        ++it;
    }

    return 0;
}
  • example 增,删,改,查vector 中的元素
#include <iostream>
#include <vector>

int main() {
    std::vector<int> nums = { 1, 2, 3, 4, 5 };

    std::cout << "original vector:(ergodic)";
    for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) 
    {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // add
    nums.push_back(6);
    std::cout << "vector (push_back(6)):";
    for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) 
    {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // delete
    std::vector<int>::iterator delit = nums.begin() + 2; // 删除第3个元素
    nums.erase(delit);
    std::cout << "vector:(erase(delit))";
    for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) 
    {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // modify
    std::vector<int>::iterator modifyit = nums.begin() + 1; // 修改第2个元素
    *modifyit = 10;
    std::cout << "vector:(use pointer here)";
    for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) 
    {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // find
    int target = 4;
    std::vector<int>::iterator findit = std::find(nums.begin(), nums.end(), target);
    std::cout << "findit " <<  *findit << std::endl;
    if (findit != nums.end()) 
    {
        std::cout << "find " << target << std::endl;
    }
    else {
        std::cout << "not find " << target << std::endl;
    }

    return 0;
}

C++ 迭代器与 数组

  • 数组是一种用于存储相同类型元素的容器。它可以包含任意数量的元素,并通过索引访问每个元素
#include <iostream>

int main() {

    int array[5] = { 1, 2, 3, 4, 5 };
    for (int i = 0; i < 5; i++) 
    {
        std::cout << "Element at index " << i << ": " << array[i] << std::endl;
    }

    return 0;
}

  • string 类型
  • auto 用于声明一个自动推断类型的迭代器
#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, world!";

    for (auto it = str.begin(); it != str.end(); ++it) 
    {
        std::cout << *it;
    }
    std::cout << std::endl;
    return 0;
}

C++ 迭代器与 列表

  • 创建一个空列表
  • 向列表中添加元素(在末尾、头部和指定位置插入)
  • 遍历并打印列表中的元素
  • 访问和修改列表中的元素(访问第一个和最后一个元素)
  • 删除列表中的元素(删除头部和指定位置的元素)
  • 检查列表是否为空
  • 清空列表
#include <iostream>
#include <list>

int main() {
    std::list<int> myList;

    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);

    std::list<int>::iterator it;
    for (it = myList.begin(); it != myList.end(); ++it) 
    {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    std::list<int>::iterator insertPos = ++myList.begin();
    myList.insert(insertPos, 15);

    for (it = myList.begin(); it != myList.end(); ++it)
    {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    std::list<int>::iterator deletePos = myList.begin();
    ++deletePos; 
    ++deletePos;
    myList.erase(deletePos);

    for (it = myList.begin(); it != myList.end(); ++it) 
    {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

  •  cpp 中列表的基本操作示例
  •     myList.push_back(5); 
        myList.push_front(3);
  •     myList.erase()
#include <iostream>
#include <list>

int main() {
    std::list<int> myList;

    myList.push_back(5); 
    myList.push_front(3);
    myList.insert(std::next(myList.begin()), 4); 

    for (const auto& num : myList) 
    {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    std::cout << "First element: " << myList.front() << std::endl;
    std::cout << "Last element: " << myList.back() << std::endl;

    myList.pop_front(); 
    myList.erase(std::next(myList.begin())); 
    for (const auto& num : myList)
    {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    if (myList.empty()) {
        std::cout << "The list is empty." << std::endl;
    }

    myList.clear();
    if (myList.empty()) {
        std::cout << "The list is empty." << std::endl;
    }

    return 0;
}

实际应用案例

迭代器运行时间计时

  • #include <chrono>
  • auto start = std::chrono::high_resolution_clock::now();
  •  auto end = std::chrono::high_resolution_clock::now();
  • auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
#include <iostream>
#include <vector>
#include <chrono>

int main() {
    std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    auto start = std::chrono::high_resolution_clock::now();

    for (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) 
    {
        std::cout << *it << " ";
    }

    auto end = std::chrono::high_resolution_clock::now();

    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();

    std::cout << "\n\n程序执行时间: " << duration << " 微秒" << std::endl;

    return 0;
}

计数器

  • count++
#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    int count = 0;
    for (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) 
    {
        count++;
    }

    std::cout << "count:" << count << std::endl;

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/749150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始,用Python编写EA实战指南

在外汇交易领域&#xff0c;EA&#xff08;Expert Advisor&#xff09;是一种基于计算机程序的交易策略&#xff0c;被广泛应用于机器人化交易和量化交易。Python作为一种高效、灵活的编程语言&#xff0c;被越来越多的投资者用于编写EA和数据分析。本文将提供一份从零开始&…

Postgresql在哪里使用列统计信息?

对pg_statistic表的查询都是走syscache的&#xff0c;要找到所有使用列统计信息地方&#xff0c;遍历系统表索引即可 enum SysCacheIdentifier {...STATEXTDATASTXOID,STATEXTNAMENSP,STATEXTOID,STATRELATTINH,... }下面是最常用的STATRELATTINH索引场景&#xff0c;即 Sear…

行业追踪,2023-07-13,新样式来了,更清晰地追踪行业趋势

自动复盘 2023-07-13 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

利用 Elasticsearch、ESRE、LLM 和 LangChain 加速制药行业的研发 — 第 1 部分

作者&#xff1a;Valerio Arvizzigno, Dimitri Marx, Francesco Di Stefano 这是一篇通过生成式 AI/LLM、自定义模型和 Elasticsearch 相关性引擎 (ESRE​​) 支持制药行业更快的药物创新和发现的综合指南。更快的药物发现带来有前途的候选药物是制药行业的主要目标。 为了支持…

Mysql表空间、段、区、页的关系

提示&#xff1a;mysql表空间、段、区、页的关系详细描述 文章目录 表空间-TABLE SPACE1 查看 表空间相关参数段&#xff08;segment&#xff09;区&#xff08;extent&#xff09;页&#xff08;page&#xff09; 表空间-TABLE SPACE 从 InnoDB 逻辑存储结构来看&#xff0c;…

顺序表 --- C语言实现

目录 1.线性表 2.顺序表 2.1 概念和结构 2.2 接口实现 2.3 数组相关面试题 2.4 顺序表的问题及思考 1.线性表 什么是线性表 &#xff1a; 线性表&#xff08;linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常…

Vue3 概述

文章目录 Vue3 概述概述Vue3对比Vue2优势使用create-vue创建项目概述创建项目目录结构 使用vue-cli创建项目概述创建项目目录结构 Vue3 概述 概述 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript…

自定义指令directives:防抖,节流,element-ui的无限滚动在el-table上使用的封装

vue官网对于自定义指令的介绍 添加链接描述 除了核心功能默认内置的指令 (v-model 和 v-show)&#xff0c;Vue 也允许注册自定义指令。注意&#xff0c;在 Vue2.0 中&#xff0c;代码复用和抽象的主要形式是组件。然而&#xff0c;有的情况下&#xff0c;你仍然需要对普通 DOM…

分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)

目录 可靠消息最终一致性分布式事务实现_RocketMQ事务消息 可靠消息最终一致性分布式事务实战_案列业务介绍 数据库表设计 可靠消息最终一致性分布式事务实战_Docker安装 RocketMQ 部署RocketMQ的管理工具 可靠消息最终一致性分布式事务实战_实现订单微服务 可靠消息最终一…

分层解耦-IOCDI-DI详解

目录 Bean注入 小结 依赖注入的注解 Resource和Autowired区别 Bean注入 Autowired注解&#xff0c;默认是按照类型进行依赖注入&#xff0c;如果存在多个相同类型的bean就会报错 解决方案 Primary&#xff08;设置bean的优先级&#xff09; Qualifier&#xff08;通过bean…

简单版本视频播放服务器V1

一直想做个家用版本的视频播放器&#xff0c;通过这个可以实现简单的电脑&#xff0c;通过浏览器就是可以访问电脑里面的视频&#xff0c;通过手机&#xff0c;平板等都是可以访问自己的视频服务了 后端代码&#xff1a; package mainimport ("fmt""io/iouti…

2023年7月13日 星期四 Linux驱动作业

1.使用platform驱动实现代码实现如下要求 a.应用程序通过阻塞的io模型来读取number变量的值 b.number是内核驱动中的一个变量 c.number的值随着按键按下而改变(按键中断) 例如number0 按下按键number1再次按下按键number0d.在按下按键的时候需要同时将1ed1的状态取反 t e.驱动…

Tik Tok你不知道的那些知识?

TikTok是一款短视频社交平台&#xff0c;由中国公司字节跳动&#xff08;ByteDance&#xff09;开发和运营。它让用户可以通过手机拍摄、编辑和分享15秒至60秒的短视频&#xff0c;涵盖了各种内容&#xff0c;包括音乐、舞蹈、喜剧、唱歌、游戏等。TikTok以其简单易用和丰富多样…

Meteor code must always run within a Fiber 报错解决办法

报错&#xff1a; 这样的写法会出现这个报错 大概的意思就是说&#xff0c;目前你这个函数不是运行在meteor的环境中&#xff0c;所以要使用Meteor.bindEnvironment&#xff0c;来改变函数运行的上下文 解决办法&#xff1a;

87. 把字符串转换成整数

目录 链接&#xff1a; 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 图片&#xff1a; 链接&#xff1a; 原题链接 题目&#xff1a; 请你写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。 当然&#xff0c;不能使用 atoi 或者其他类似的库函数…

摆脱基础设施束缚,亚马逊云科技提出生成式AI方法论

“未来近在咫尺&#xff0c;只不过时隐时现 (The future is here, its just not evenly distributed yet.)”--亚马逊云科技全球产品副总裁Matt Wood博士引用“赛博朋克之父” William Gibson 的一句名言来表达生成式AI的发展现状。 自去年底ChatGPT惊艳众人开始&#xff0c;这…

云原生高性能API网关,选Apache APISIX还是Nginx Plus

文章首发地址 Apache APISIX 对比 Nginx Plus APISIX 和 Nginx Plus 都是高性能的 API 网关&#xff0c;具有类似的特点&#xff0c;如可扩展性、插件化、负载均衡、反向代理等。下面对 APISIX 和 Nginx Plus 进行对比&#xff1a; 开源授权&#xff1a;APISIX 是 Apache 开…

Java阶段五Day05

Java阶段五Day05 文章目录 Java阶段五Day05问题解析无法启动Naocs Nacos服务注册发现Nacos运行架构nacos-server是一个服务进程 配置注册服务端客户端csmall-for-jsd-business-adapter 整合nacos-clientyaml详细配置注册信息在nacos中的内存状态多实例注册服务抓取&#xff08;…

五大引擎全新升级!轻流 5.0 正式发布

轻流的5.0版本&#xff0c;一个“陪伴企业成长的一站式开发平台”&#xff0c;它将更加灵活、更加开放&#xff0c;同时更加低门槛。 ——轻流联合创始人&CPO 严琦东 7月6日&#xff0c;在一年一度的无代码无边界 202376Day 轻流无代码探索者大会上&#xff0c;轻流联合创…

SpringMVC实现对页面的访问和跳转~

初识MVC: MVC是一种软件架构的思想&#xff0c;将软件按照模型&#xff0c;视图&#xff0c;控制器来划分 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean,作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean:专门存储业务数据的&…