C++ STL 迭代器方法 之 advance与prev 方法 浅析

2023-11-07

【摘要】

迭代器是STL中重要的一支,prev和distance是其基本方法。distance方法十分简单,就不在此赘述,现主要对prev方法以及其相关方法——advance方法作简要介绍与使用说明,并在文末附上代码示例。

【Advance 方法】

Advance iterator

Advances the iterator it by n element positions.
If it is a random-access iterator, the function uses just once operator+ or operator-. Otherwise, the function uses repeatedly the increase or decrease operator (operator++ or operator--) until n elements have been advanced.

advance迭代器就是将迭代器it,移动n位。如果it是随机访问迭代器,那么函数进行1次运算符计算操作,否则函数将对迭代器进行n次迭代计算操作。
代码示例

// advance example
#include <iostream>     // std::cout
#include <iterator>     // std::advance
#include <list>         // std::list

int main () {
  std::list<int> mylist;
  for (int i=0; i<10; i++) mylist.push_back (i*10);

  std::list<int>::iterator it = mylist.begin();

  std::advance (it,5);

  std::cout << "The sixth element in mylist is: " << *it << '\n';// 输出 50

  return 0;
}
解析

注意,移动5次,输出的是第6个元素而不是第5个元素。

【Prev 方法】

Get iterator to previous element
Returns an iterator pointing to the element that it would be pointing to if advanced -n positions.

If it is a random-access iterator, the function uses just once operator+ or operator-. Otherwise, the function uses repeatedly the increase or decrease operator (operator++ or operator--) on the copied iterator until n elements have been advanced.

如果是随机访问迭代器,就只执行一次运算符操作(+或-),否则,执行n次持续的递减或递增操作。

代码示例

#include <iostream>     // std::cout
#include <iterator>     // std::advance
#include <list>         // std::list
#include <algorithm>

int main () {
  std::list<int> mylist;
  for (int i=0; i<10; i++) mylist.push_back (i*10);

//std::cout<<*upper_bound(mylist.begin(), mylist.end(), 100)<<std::endl;// 抛出异常
  std::cout<<*lower_bound(mylist.begin(), mylist.end(), 0)<<std::endl;// 输出 0
  std::cout<<*prev(upper_bound(mylist.begin(), mylist.end(), 100))<<std::endl;// 输出 90
  std::cout<<*prev(++upper_bound(mylist.begin(), mylist.end(), 90))<<std::endl;// 抛出异常
//std::cout<<*prev(lower_bound(mylist.begin(), mylist.end(), 0))<<std::endl;// 抛出异常
  return 0;
}

解析

prev在VC6.0之中不能实现,在VS2010之中可以实现。实际实现的操作是将迭代器递减一个单位长度而已,并未见所谓的递增操作或者根据是否作为随机迭代器时的一次或者n次操作!

【复盘】

详见:LeetCode 之 Search for a Range(查找)

详址:http://blog.csdn.net/u013630349/article/details/47099915

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        const int l = distance(nums.begin(), lower_bound(nums.begin(), nums.end(), target));
        const int u = distance(nums.begin(), --upper_bound(nums.begin(), nums.end(), target));
        if (nums[l] != target) // not found
        	return vector<int> { -1, -1 };
        else
        	return vector<int> { l, u };
    }
};

解析:

源码验证AC,只是在原来基础上将 “prev(... )”改为  “--(... )”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ STL 迭代器方法 之 advance与prev 方法 浅析 的相关文章

  • 如何在 Java 中获得列表的反向列表视图?

    我想在列表上有一个反向列表视图 与List sublist提供列表上的子列表视图 是否有一些函数可以提供此功能 我不想复制该列表 也不想修改该列表 在这种情况下 如果我能在列表上至少获得一个反向迭代器就足够了 另外 我知道如何自己实现这一点
  • 如何对STL向量进行排序?

    我想排序一个vector vector
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 是否允许将 std::vector 的元素插入到同一向量中?

    考虑以下insert and emplace的成员函数std vector
  • 从迭代器外部将 StopIteration 发送到 for 循环

    有几种方法可以打破一些嵌套循环 他们是 1 使用中断 继续 for x in xrange 10 for y in xrange 10 print x y if x y gt 50 break else continue only exec
  • std::vector 迭代器失效

    之前有几个关于这个问题的问题 我的理解是调用std vector erase只会使位于某个位置的迭代器无效after被擦除的元素 然而 擦除一个元素后 该位置的迭代器是否仍然有效 当然 前提是它不指向end 擦除后 我对向量如何实现的理解似
  • 用于建模一般树结构及其迭代器的智能指针

    我通过为每个节点建立一个类来建模一般树结构 该类包含指向父级 第一个子级和第一个兄弟级的指针 以及指向最后一个兄弟级的指针 不需要 但有用 为此 我添加了一些额外的数据 我目前的实现是 class TreeNode typedef boos
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • 在 std::vector> 中迭代 const T&

    我有一堂这样的课 class RPNExpr std vector
  • 如何在 C++ 中对四元结构进行有效排序?

    我有一个包含 x y z 和 w 成员的结构 如何高效排序 在 C 中首先按 x 然后按 y 按 z 最后按 w 如果你想实现字典排序 那么最简单的方法是使用std tie实现小于或大于比较运算符或函子 然后使用std sort http
  • 采用迭代器而不是可迭代的方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 关于迭代器和可迭代对象 仅是我的观察 如果我错了 请纠正我 大多数构造函数 数组类型 将迭代器作为质量构造函数 迭代器是显式创建的 或
  • 为什么不能收集一定范围的字符?

    我正在尝试生成一个包含小写 ASCII 字符的向量 这种更复杂的方法有效 let ascii lowercase b a b z map b b as char collect
  • allocator.construct 循环是否等于 std::uninitialized_copy?

    在此背景下T是某种类型并且allocator是该类型的分配器对象 默认情况下是std allocator
  • 访问由 std::shared_ptr 包装的类的运算符重载

    我的想法是我想要一个由以下内容包裹的类std shared ptr 仍然可以使用 就像它们不是指针一样 例如在我的类中定义的operator 我的课程结束后仍然可以使用std shared ptr 例如 template
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 为什么我不能执行 std::map.begin() + 1?

    我有一个std map 我想从第二个条目开始迭代 我可以解决这个问题 但我对为什么 明显 语法无法编译感到困惑 该错误消息没有帮助 因为它指的是std string 我在这里没有使用它 这是一些代码 Suppose I have some
  • 内在数组访问比 std::vector 访问快得多——黑魔法?

    我已经设置了一个测试程序来将数组访问性能与 std vector 的访问性能进行比较 我发现了几个类似的问题 但似乎没有一个问题能解决我的具体问题 一段时间以来 我一直在摸不着头脑 为什么数组访问似乎比向量访问快 6 倍 而我过去读到它们应
  • 向量和常量

    考虑一下这个 void f vector
  • 当我从 main 调用 ctor 时,为什么在作用域结束之前调用 dtor? (实验性)

    这里我调用类的构造函数a in main 没有创建该类的对象 并且看起来析构函数在调用后立即被调用 这里到底发生了什么 根据我的理解 发生这种情况是因为我没有创建一个具有内存的对象 医生是怎么被叫到这里的 它是如何实施的 请分享您对此的想法
  • “yield item”与 return iter(items) 相比有何优点?

    在下面的示例中 resp results 是一个迭代器 版本1 items for result in resp results item process result items append item return iter items

随机推荐

  • 蓝桥杯真题31日冲刺国一

    大家好 我是泡泡 接下来几天每天都有复习 目录 今日练习专题 一丶成绩统计 二丶既约分数 三丶最优包含 复习专题 一丶空间 二丶等差数列 三丶回文日期 四丶青蛙跳杯子 今日练习专题 一丶成绩统计 题目链接 成绩统计 蓝桥云课 lanqiao
  • 机器学习中如何选择分类器

    在机器学习中 分类器作用是在标记好类别的训练数据基础上判断一个新的观察样本所属的类别 分类器依据学习的方式可以分为非监督学习和监督学习 非监督学习顾名思义指的是给予分类器学习的样本但没有相对应类别标签 主要是寻找未标记数据中的隐藏结构 监督
  • C#实现的根据年月日计算星期几的函数

    算法如下 基姆拉尔森计算公式 W d 2 m 3 m 1 5 y y 4 y 100 y 400 mod 7 在公式中d表示日期中的日数 m表示月份数 y表示年数 注意 在公式中有个与其他公式不同的地方 把一月和二月看成是上一年的十三月和十
  • pandas 报警告:A value is trying to be set on a copy of a slice from a DataFrame

    pandas 报警告 A value is trying to be set on a copy of a slice from a DataFrame 我在抽取了原来DataFrame数据的几列后 对抽取后的数据进行赋值操作时弹出这个警告
  • 提取分割单引号 ‘ ‘ 之间的内容且不重复分割单引号 python

    分割两个单引号之间的内容 且不重复分割已使用的单引号 废话少说 直接上干货 import re result re findall string 将string替换为你需要分割的部分 示例代码 string jmp qword ptr ri
  • MySQL - Left Join和Inner Join的效率对比,以及优化

    最近在写代码的时候 遇到了需要多表连接的一个问题 初始sql类似于 select from a left join b on a id b aid left join c on c bid b id left join d on d cid
  • 什么是DI

    Spring致力于简化java企业级开发 促进代码松耦合 成功的关键在于依赖注入和AOP Spring通过应用上下文 Application Context 装载bean的定义并把他们组装起来 Spring应用上下文全权负责对象的创建和组装
  • python3发送邮件带附件,Python3.4 邮件发送(含带中文附件)详解

    import smtplib import os from email mime text import MIMEText from email mime multipart import MIMEMultipart from email
  • Xshell使用密钥登录Linux服务器

    1 使用如下命令生成密钥对 root xuegod130 ssh keygen Generating public private rsa key pair Enter file in which to save the key root
  • jsonp 实现跨域 同时也是一个 webflux 的demo 示例

    文章目录 核心原理 代码 html 服务端 java 为例子 服务端目录结构 核心原理 前端 使用js 创建 script 标签 将请求地址 放到其src 中 并将 script 标签追加到文档流 后端 根据约定好的 callback 字段
  • element-ui 首页布局

    效果 代码
  • [python]numpy 中的@运算

    运算其实等价于矩阵乘法 r location s y l location r location 1 np dot s y l location 与上面式子等价
  • java 保留字符串数字的位数,不够前面补0

    Test public void test this printToConsole autoGenericCode 10011 this printToConsole autoGenericCode 000 3 不够位数的在前面补0 保留c
  • 数模笔记——论文写作

    论文写作 各模块写作要点 数学建模论文的重要性 数学建模论文的写作是数学建模中重要的一个环节 数学建模的论文是参赛队工作的全面总结 也是评委评价建模成绩的主要依据 一篇好的论文应该逻辑清晰 在语言表述上清楚 数学符号标记清晰 对于读者或者评
  • 学习JavaScript以及React技术报告

    在学习JS中遇到的一些问题总结 1 我们需要在页面加载时能够通过javascript去动态操作html中的一些对象 对于这些操作 我们最好是在body中定义onload操作 然后在该操作中去完成这些任务 尽量避免在html中嵌入script
  • 操作系统课程设计3_系统调用

    一 实验目的 1 学习怎样重新编译 Linux 内核 2 理解 掌握 Linux 标准内核和发行版本内核的区别 二 实验内容 1 通过重新编译Linux来实现系统调用 2 通过增加模块来实现系统调用 三 实验步骤和结果 一 通过重新编译内核
  • Voting【Codeforces 1251 E1 && E2】【贪心】

    Educational Codeforces Round 75 Rated for Div 2 E2 Now elections are held in Berland and you want to win them More preci
  • Huawei Cloud EulerOS(Linux)常用命令汇总

    更改主机名称 hostnamectl set hostname
  • SLF4J简介与使用(整合log4j)

    一 概念 SLF4J的全称是Simple Logging Facade for Java 即简单日志门面 SLF4J并不是具体的日志框架 而是作为一个简单门面服务于各类日志框架 如java util logging logback和log4
  • C++ STL 迭代器方法 之 advance与prev 方法 浅析

    摘要 迭代器是STL中重要的一支 prev和distance是其基本方法 distance方法十分简单 就不在此赘述 现主要对prev方法以及其相关方法 advance方法作简要介绍与使用说明 并在文末附上代码示例 Advance 方法 A