随机访问 的 迭代器 (iterator)

本文通过一个具体的C++ STL示例展示了如何使用迭代器遍历容器,并演示了不同方式访问容器元素的方法,包括使用迭代器、下标运算符及算术运算。
//itercat

#include <iostream>
#include <vector>
#include "print_elements.h"
using namespace std;

int main()
{
	vector<int> coll1;

	for(int i = -3;i <= 9; ++i)
	{
		coll1.push_back(i);
	}

	PRINT_ELEMENTS(coll1);

	cout << "number /distance: " << coll1.end() - coll1.begin() <<endl;

	//use operator <
	//list ,set  不能用
	vector<int> ::iterator pos;
	for(pos = coll1.begin(); pos < coll1.end(); ++ pos)
	{
		cout << *pos <<" ";
	}
	cout <<endl;

	//use operator[]
	
	for(int i = 0;i < coll1.size(); ++i)
	{
		cout << coll1.begin()[i] <<" ";
	}
	cout <<endl;
	pos = coll1.begin();
	for(int i = 0;i < coll1.size(); ++i)
	{
		cout << pos[i] << " " ;
	}
	cout <<endl;

	//use +=
	for(pos = coll1.begin(); pos < coll1.end() -1;pos +=2)
	{
		cout << *pos << " " ;
	}
	cout <<endl;
	system("pause");
	return 0;
}


随便写写 stl,例子里写起来真是感到很优美,自己写代码用匈牙利命名法,感觉写不出这种美感 ~~Damn

<think> 我们正在讨论C++迭代器类型。用户询问“非随机访问迭代器”的定义。根据引用内容,迭代器分为5类:输入、输出、前向、双向、随机访问。非随机访问迭代器包括前向迭代器、双向迭代器以及输入/输出迭代器(但输入/输出迭代器通常用于流,不用于容器)。 根据引用[3]和引用[5]: - 输入迭代器:只读,支持++、==、!=、*(解引用)等,但只能单遍扫描。 - 输出迭代器:只写,支持++、*(赋值)等,也只能单遍扫描。 - 前向迭代器:支持输入和输出迭代器的所有操作,并且可以多遍扫描(即可以保存迭代器状态并在之后继续使用)。 - 双向迭代器:在前向迭代器基础上增加支持--操作(向前移动)。 - 随机访问迭代器:支持双向迭代器的所有操作,还支持+=、-=、+、-、[]以及比较运算符(<, >, <=, >=)等(引用[1][2])。 因此,非随机访问迭代器是指除随机访问迭代器之外的所有迭代器类型,即输入迭代器、输出迭代器、前向迭代器和双向迭代器。它们不支持随机访问(即不能直接跳转到任意位置,只能逐个移动)。 下面我们详细说明非随机访问迭代器的定义: 1. 输入迭代器(Input Iterator): - 用于读取序列中的元素 - 支持的操作:递增(++)、解引用(*,只能出现在赋值运算符右侧)、相等比较(==)和不等比较(!=) - 典型应用:读取输入流(如`istream_iterator`) 2. 输出迭代器(Output Iterator): - 用于写入序列中的元素 - 支持的操作:递增(++)、解引用(*,只能出现在赋值运算符左侧) - 典型应用:输出流(如`ostream_iterator`) 3. 前向迭代器(Forward Iterator): - 支持输入迭代器和输出迭代器的所有操作(因此既可以读也可以写,但读写可能受容器限制) - 支持多遍扫描(即可以对同一个序列进行多次遍历) - 典型应用:单向链表(如`forward_list`) 4. 双向迭代器(Bidirectional Iterator): - 支持前向迭代器的所有操作 - 额外支持递减(--)操作,即可以向前移动 - 典型应用:双向链表(如`list`) 注意:非随机访问迭代器不支持以下操作(这些是随机访问迭代器特有的): - 迭代器与整数的加减(如`iter + n`) - 迭代器之间的减法(如`iter1 - iter2`) - 下标访问(如`iter[n]`) - 直接使用关系运算符比较两个迭代器的位置(除了相等性比较和`==`、`!=`,双向迭代器及以上支持`==`和`!=`,但随机访问迭代器还支持`<`, `<=`, `>`, `>=`) 根据引用[1][2]:随机访问迭代器支持`p+=i`, `p-=i`, `p+i`, `p-i`, `p[i]`以及关系运算符(`<`等),而非随机访问迭代器不支持这些。 因此,非随机访问迭代器的定义可以概括为:不支持随机访问(即不能以任意偏移量直接访问元素)的迭代器,包括输入迭代器、输出迭代器、前向迭代器和双向迭代器。 总结: - 非随机访问迭代器:只能通过递增(++)或递减(--,如果是双向迭代器)逐个元素移动,不能直接跳转。 在STL中,不同容器提供的迭代器类型: - `vector`, `deque`, `array`, `string`:随机访问迭代器 - `list`, `set`, `map`:双向迭代器 - `forward_list`:前向迭代器 - `unordered_set`, `unordered_map`:前向迭代器(C++11中,实际上它们提供的是前向迭代器,因为桶内是链表,桶之间是单向遍历) 另外,流迭代器(如`istream_iterator`, `ostream_iterator`)属于输入或输出迭代器。 引用说明: - 引用[3]和引用[5]介绍了迭代器的五大种类及其继承关系(高层迭代器支持底层迭代器的所有操作)。 - 引用[1]和引用[2]则具体说明了随机访问迭代器的操作,从而反推非随机访问迭代器不支持这些操作。 因此,我们给出如下回答: </think> ### 非随机访问迭代器的定义 非随机访问迭代器是指**不支持随机跳跃访问元素**的迭代器类型。这类迭代器只能通过顺序或有限步进的方式移动,无法直接通过算术运算(如 `+n`)跳转到任意位置。主要包含以下三类: --- #### 1. **输入迭代器(Input Iterator)** - **功能**:仅支持单向顺序读取数据 - **核心操作**: - `++iter`:前移一位 - `*iter`:解引用(只读) - `iter1 == iter2`:相等比较 - **限制**: - 不能修改元素 - 不支持反向移动(`--`) - 不能重复遍历同一序列(单次扫描) - **典型应用**:`std::istream_iterator`(从输入流读取数据)[^3][^5] --- #### 2. **输出迭代器(Output Iterator)** - **功能**:仅支持单向顺序写入数据 - **核心操作**: - `++iter`:前移一位 - `*iter = value`:解引用赋值(只写) - **限制**: - 不能读取元素 - 不支持反向移动 - 单次扫描后失效 - **典型应用**:`std::ostream_iterator`(向输出流写入数据)[^3][^5] --- #### 3. **双向迭代器(Bidirectional Iterator)** - **功能**:支持双向顺序访问 - **核心操作**: - `++iter`:前移一位 - `--iter`:后移一位 - `*iter`:解引用(读写) - **限制**: - 不支持跳转访问(例如 `iter + 5`) - 不支持关系运算(如 `<`, `>`) - **典型容器**:`std::list`, `std::set`, `std::map`[^3][^4][^5] ```cpp std::list<int> lst{1, 2, 3}; auto it = lst.begin(); ++it; // ✅ 允许前移 --it; // ✅ 允许后移 it + 2; // ❌ 编译错误!非随机访问 ``` --- #### 关键特性对比 | 迭代器类型 | 移动方向 | 读操作 | 写操作 | 重复遍历 | 跳转访问 | |------------------|------------|--------|--------|----------|----------| | **输入迭代器** | 单向(前) | ✅ | ❌ | ❌ | ❌ | | **输出迭代器** | 单向(前) | ❌ | ✅ | ❌ | ❌ | | **双向迭代器** | 双向 | ✅ | ✅ | ✅ | ❌ | | **随机访问迭代器**| 任意方向 | ✅ | ✅ | ✅ | ✅ | > **设计意义**:非随机访问迭代器通过限制操作范围,为链表、树、流等数据结构提供统一的遍历接口,同时保证操作安全性(如避免链表跳跃导致未定义行为)[^4][^5]。 --- #### 与随机访问迭代器的区别 随机访问迭代器(如 `std::vector` 的迭代器)额外支持: ```cpp iter += n; // 跳转n个位置 iter1 - iter2; // 计算距离 iter[n]; // 直接访问第n个元素 iter1 < iter2; // 位置比较 ``` 而非随机访问迭代器**均不支持这些操作**(编译错误)[^1][^2]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值