【vector的各个begin迭代器详解】

news/2024/11/17 20:31:10/

前言

本文是熊猫练习stl一段时间之后,对vector容器的各种迭代器产生了很大的好奇心,于是对它们进行了以下探究。
在这里插入图片描述
从图中我们可以知道,vector一个有四组不同的迭代器,
其中,字符 ‘c’ 是 const 常量的意思,既所指向的对象不能修改
字符 ’ r ’ 是 reverse 反转的意思,既从后往前遍历数据。
注意:rbegin() 迭代器的操作和它的名字一样:是反向的,与我们平时的理解不一样,eg:
rit = rbegin(); rit++;
这里的rit相当于指向最后一个位置的数据的指针, rit++;表示指针向后走一步,
按照我们平时的理解:此时rit指向最后一个数据的下一个位置,
然而实际上:此时rit指向最后一个数据左边的位置,也就是 “2022”的第二个 2,
这也就是reverse 反转的特点,迭代器从后往前进行遍历。

void test06()
{vector<int>v1;for (int i = 0; i < 10; ++i){v1.push_back(i);}//  不同的返回值需要使用对应的迭代器接收vector<int>::iterator it;      //  迭代器vector<int>::const_iterator cit; //  常量迭代器vector<int>::reverse_iterator rit; //  反向迭代器vector<int>::const_reverse_iterator crit;  // 常量反向迭代器// begincout << "begin:" << endl;it = v1.begin();cout << "*it = " <<*it << endl;cout << "改变迭代器的指向" << endl;++it;cout << "*it = " << *it << endl;cout << "通过迭代器改变原数据" << endl;*it += 2;cout << "*it = " << *it << endl << endl;*it -= 2;  //  数据复原//cbegincit = v1.cbegin();cout << "cbegin:" << endl;cout << "*cit = " << *cit << endl ;cout << "改变常量迭代器的指向" << endl;++cit;cout << "*cit = " << *cit << endl;cout << "不能通过常量迭代器更改原数据" << endl << endl;/**cit += 2;     // 错误  常量不可改变cout << "*cit+2 = " << *cit+2 << endl;*/// rbeginrit = v1.rbegin();cout << "rbegin:" << endl;cout << "*rit = " << *rit << endl;cout << "改变反向迭代器的指向" << endl;++rit;   //  特别注意cout << "*rit = " << *rit << endl;cout << "通过反向迭代器改变原数据" << endl;*rit += 2;cout << "*rit = " << *rit << endl << endl;*rit -= 2;  //  数据复原// crbegincrit = v1.crbegin();cout << "crbegin:" << endl;cout << "*crit = " << *crit << endl;cout << "改变常量反向迭代器的指向" << endl;++crit;   //  特别注意cout << "*crit = " << *crit << endl;cout << "不能通过常量反向迭代器改变原数据" << endl;//cout << "通过迭代器改变原数据" << endl;//*crit += 2;   //  错误  常量不可改变//cout << "*crit = " << *crit << endl << endl;//*crit -= 2;
}

运行示例:这里是引用

举个栗子:

void Print(int v)
{cout << v << ' ';
}void test07()
{vector<int>v1;for (int i = 0; i < 10; ++i){v1.push_back(i);}vector<int>v2(v1);  // 拷贝构造vector<int>v3(v1);  // 拷贝构造cout << "v1" << endl;cout << "原数据:" << endl;for_each(v1.begin(), v1.end(), Print);cout << endl;cout << "反向输出的三种方法" << endl;cout << "1.排逆序,输出" << endl;sort(v1.begin(), v1.end(), greater<int>());for_each(v1.begin(), v1.end(), Print);cout << endl << endl;cout << "2.数据进行reverse,输出" << endl;reverse(v2.begin(), v2.end());for_each(v1.begin(), v1.end(), Print);cout << endl << endl;cout << "3.不改变原数据,传反转迭代器" << endl;for_each(v3.rbegin(), v3.rend(), Print);cout << endl << endl;
}

结果:
在这里插入图片描述

总结

最初参考文章:c++ vector cbegin的用法及代码演示
本文主要是兴趣使然,在实际应用中还是 begin 和 end 使用最多,不过知道了这些迭代器的使用方法,那么以后在写程序时遇到了那就是自己不想使用,而不是因为不了解而不会使用了,哈哈,希望能给正在看文章的你提供帮助。


http://www.ppmy.cn/news/7632.html

相关文章

企业需要防范的 6 个常见身份攻击手段|身份云研究院

零信任作为新一代的网络安全防护理念&#xff0c;已经成为全球网络安全管理的基石。零信任的核心是 「安全体系架构从网络中心化走向身份中心化」&#xff0c;「以身份为中心」的网络访问控制理念也逐渐被越来越多企业接受并实践。 然而企业在面向用户身份访问和管理的实践中还…

建模杂谈系列190 APIFunc 调用 APIFunc

说明 从工作的划分和复用上,这种模式是必须 还是积木拼凑的思维,之前的APIFunc实现时,已经发现有一些过程是会被经常复用的。这些连续的过程,可以称之为会话,或者说是链,都是一个意思。 APIFunc在定义的时候,需要在字典中定义若干不重名的函数,所以之前有一个思路是:…

Java BigDecimal总结

文章目录Java BigDecimal总结概述float 和 double的问题创建BigDecimal对象BigDecimal.valueOf()源码分析equals() 和 compareTo()BigDecimal设置精度和舍入模式舍入模式介绍BigDecimal转字符串DecimalFormat 格式化总结Java BigDecimal总结 概述 BigDecimal类在Java的java.m…

补充订单不同的订单方式

其实补充订单不是就简简单单的下单评价&#xff0c;它里面有分很多种类的方法&#xff0c;不同时期店铺对补充订单的要求也不一样。 1.直播单 顾名思义&#xff0c;就是在挂着你产品链接里的直播间下单。 是需要要求买手跟主播互动咨询产品问题&#xff0c;发现其直播间&#x…

跟着pink老师学JS的第三天总结

* 这个仿京东的商品放大镜效果真不好做&#xff01; 鼠标拖拽&#xff1a; * 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…

PLC实现十字路口交通灯的控制课程设计毕业设计

微信公众号&#xff1a;创享日记 对话框发送&#xff1a;plc十字路口 获取完整源码源程序文件 要求&#xff1a; 1、信号灯受启动及停止按钮的控制&#xff0c;当按下启动按钮时&#xff0c;信号灯系统开始工作&#xff0c;并周而复始地循环工作&#xff0c;当按下停止按钮时&…

用于高精度干涉仪的奇特量子效应

使用物质波放大、跟踪加速度&#xff0c;以前从未以便携式形式实现。&#xff08;图片来源&#xff1a;网络&#xff09; 来自法国的一组研究人员开发了第一个三向混合量子惯性传感器&#xff0c;它可以在不使用卫星信号的情况下测量加速度。这个突破性设备的核心是“物质波干涉…

ubuntu下编译opencv

目录 1. 下载opencv和opencv-contrib 2. 安装依赖 3. cmake 4. make 5. 安装 6. 配置opencv的路径 7. 测试 后续 1. 下载opencv和opencv-contrib https://github.com/opencv/opencv/archive/refs/tags/4.6.0.zip https://github.com/opencv/opencv_contrib/archive/re…