C++之STL的algorithm(9)advance和prev(移动迭代器)算法整理

C++之STL的algorithm(9)之移动迭代器advance和prev算法整理

注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构



提示:本文为 C++ 中advance、prev的写法和举例


一、 advance移动迭代器

  std::advance 是 C++ 标准库中的一个用于移动迭代器指定的次数的算法,它能指定移动步长。当你想要移动一个迭代器,而不是通过多次递增或递减它时,当容器不适用随机访问迭代器时候,这对于基于范围的 for循环或其他不需要手动迭代的情况特别有用。尤其是对于不支持简单算术操作的迭代器类型(如双向链表list或关联容器map、set的迭代器)。

这个函数有两个参数:要移动的迭代器和一个整数,表示要移动的次数。如果是正数,迭代器会向前移动;如果是负数,迭代器会向后移动。
请注意,尽管在随机访问迭代器上可以使用it = it + 2这样的操作,但使用std::advance可以提供更通用和一致的行为,因为它可以处理所有类型的迭代器,包括那些不支持简单算术运算的迭代器。因此,在编写可移植和健壮的代码时,通常推荐使用std::advance。对于std::prev,它提供了一种简洁的方法来获取指向容器中当前元素之前元素的迭代器。

std::advance 和prev语法格式

std::advance 用于将迭代器向前或向后移动指定的次数。(负数就向前,这时相当于prev算法)
std::prev 用于返回指向容器中当前迭代器位置向前1个或几个元素的迭代器。

template<class InputIterator, class Distance>  
void advance(InputIterator& it, Distance n);
InputIterator:迭代器类型,通常是容器的迭代器。
Distance:要移动的次数,可以是正数(向前移动)或负数(向后移动)。
it:要移动的迭代器引用。

1、移动vector的迭代器

对于 std::vector,由于它是连续内存存储的,std::advance 的操作通常是非常高效的,因为它可以通过简单的指针算术来移动迭代器。

下面是一些使用 std::advance 来移动不同容器迭代器的例子:

std::vector 示例

#include <iostream>  
#include <vector>  
#include <iterator>  
  
int main() {
   
     
    std::vector<int> vec = {
   
   1, 2, 3, 4, 5};  
    std::vector<int>::iterator it = vec.begin();  
    std::advance(it, 3); // 移动到第4个元素  
    std::cout << *it << std::endl; // 输出: 4  
    return 0;  
}

2、移动list

下面是一个简单的例子,展示了如何使用 std::advance 来移动 std::list 的迭代器:

### C++ 迭代器相关头文件 在 C++ 中,迭代器的相关功能主要由标准库提供支持。这些功能分布在多个头文件中,具体如下: #### `<iterator>` 头文件 `<iterator>` 是专门用于定义迭代器相关的类函数的头文件。它包含了各种迭代器类别(如输入迭代器、输出迭代器、前向迭代器、双向迭代器随机访问迭代器)的支持[^1]。此外,该头文件还提供了以下工具: - `std::begin()` `std::end()`:分别返回容器的第一个元素最后一个元素之后的位置。 - `std::distance()`:计算两个迭代器之间的距离。 - `std::advance()`:使迭代器前进指定数量的步数。 - `std::next()` `std::prev()`:分别获取下一个或上一个位置的迭代器。 示例代码展示如何使用 `<iterator>` 提供的功能: ```cpp #include <iostream> #include <vector> #include <iterator> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; auto it = std::next(vec.begin(), 2); // 获取第三个元素的迭代器 std::cout << *it << std::endl; // 输出 3 return 0; } ``` #### 容器头文件 不同的 STL 容器会自动引入它们自己的迭代器类型。例如: - 使用 `std::vector` 需要包含 `<vector>`。 - 使用 `std::list` 需要包含 `<list>`。 - 使用 `std::map` 或 `std::unordered_map` 则需要包含 `<map>` 或 `<unordered_map>`。 每种容器都通过其内部定义的方式实现了特定类型的迭代器。例如,在 `std::vector` 的情况下,迭代器通常是普通的指针实现;而在更复杂的结构(如链表或树)中,迭代器可能是一个类的对象[^2]。 #### 其他常用头文件 除了上述提到的核心头文件外,还有一些其他头文件也可能间接涉及迭代器的操作: - `<algorithm>`:许多算法依赖于迭代器来操作序列化数据,比如 `std::sort`、`std::copy` 等。 - `<functional>`:某些高级特性需要用到自定义比较器或者谓词,这也会涉及到迭代器作为参数传递的情况。 总结来说,对于大多数项目而言,只需显式包含一次 `<iterator>` 即可满足基本需求,而具体的容器类型则需视实际使用的场景决定是否额外导入相应的头文件[^3]。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值