iterator循环和反向迭代器的使用

本文通过一个C++示例程序详细介绍了如何使用std::map的迭代器和反向迭代器进行元素遍历,包括在debug和release模式下的行为差异,并展示了正确的迭代方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// testmap.cpp : Defines the entry point for the console application.
//
#include <map>
#include <vector>
using namespace std;

int main()
{
	std::map<int, int> tv;
	for (int i = 0; i < 3; i++)
	{
		tv[i] = i;
	}

	{
		///在debug模式下崩溃,在release下出错
		printf("release --\n");
		///在release模式下可以使用
		std::map<int, int>::iterator riter = tv.begin();
		for (int j = 0; j < 10; j++) {
			if (riter == tv.end()) {
				riter--;
				continue;
			} else {
				printf("%d, %d\n", riter->first, riter->second);
			}
			riter--;
		}
		printf("release ++\n");
		///在release下只能输出到012
		std::map<int, int>::iterator iter = tv.begin();
		for (int j = 0; j < 10; j++) {
			if (iter == tv.end()) {
				iter++;///之后这句无效无法继续累加跳过end
				continue;
			} else {
				printf("%d, %d\n", iter->first, iter->second);
			}
			iter++;
		}
	}
	{
		///标准用法
		printf("stand --\n");
		std::map<int, int>::reverse_iterator riter = tv.rbegin();
		for (int j = 0; j < 10; j++) {
			if (riter == tv.rend()) {
				riter = tv.rbegin();
				continue;
			} else {
				printf("%d, %d\n", riter->first, riter->second);
			}
			riter++;
		}
		printf("stand ++\n");
		std::map<int, int>::iterator iter = tv.begin();
		for (int j = 0; j < 10; j++) {
			if (iter == tv.end()) {
				iter = tv.begin();
				continue;
			} else {
				printf("%d, %d\n", iter->first, iter->second);
			}
			iter++;
		}
		///可以使用强制转换在reverse_iterator和iterator之间
		std::map<int, int>::reverse_iterator a(iter);
		///但不能逆向转换std::map<int, int>::iterator b(riter);
	}
	getc(stdin);
	return 0;
}


### C++ String 反向迭代器使用方法 在 C++ 中,`std::string` 提供了反向迭代器的功能,允许从字符串末尾向前遍历字符。以下是关于 `std::string` 的反向迭代器使用的详细介绍。 #### 创建初始化反向迭代器 可以利用成员函数 `rbegin()` `rend()` 来获取指向字符串最后一个有效字符位置以及理论上的前一个位置之前的反向迭代器: ```cpp #include <iostream> #include <string> int main() { std::string str = "hello"; // 获取反向迭代器 auto rit = str.rbegin(); } ``` #### 遍历整个字符串 通过循环结构配合上述获得的反向迭代器对象实现对字符串内所有元素按逆序访问的效果: ```cpp for (; rit != str.rend(); ++rit) { std::cout << *rit; } // 输出 olleh ``` 这里需要注意的是,在比较终止条件时应采用不等于运算符(`!=`)而非小于号(`<`);另外每次迭代操作后记得更新当前指针的位置即执行自增/自减动作以便移动到下一个目标处[^1]。 #### 查找特定子串并打印其后的部分 假设现在有一个需求是要找到某个指定模式第一次出现的地方之后的内容,则可借助标准库中的算法如 `std::search` 结合反向迭代来进行处理: ```cpp if (auto pos = std::search(str.rbegin(), str.rend(), std::boyer_moore_searcher( target_string.rbegin(), target_string.rend())); pos != str.rend()) { // 找到了匹配项 std::copy(pos.base(), str.end(), std::ostream_iterator<char>(std::cout)); } else { // 没有发现任何符合条件的结果 std::cout << "Not Found!"; } ``` 此段代码展示了当定位成功后如何继续输出剩余未被检索过的序列片段[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值