迭代器(一):基础知识

<基于 C++ Primer P95>
迭代器是一种相较于下标运算符而言更为通用的访问 string 对象的字符或 vector 对象的元素的机制。因为除了 vector 之外,标准库还定义了其他几种容器。所有标准库容器都可以使用迭代器访问,但是其中只有少数几种才同时支持下标运算符。string 对象虽然不属于容器类型,但是 string 支持很多与容器类型类似的操作。
1.类似于指针类型,迭代器提供了对对象的间接访问,也有有效与无效之分。
2.与指针类型不同,获取迭代器不使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。

// b 表示 v 的第一个元素,e 表示 v 尾元素的下一个位置
auto b = v.begin(), e = v.end();

我们使用了 auto 关键字定义变量 b 和 e,一般而言,我们不在意迭代器准确的类型到底是什么。如果容器为空,则 begin 和 end 返回的是同一个迭代器,都是尾后迭代器。
3.标准容器迭代器的运算符

*iter
iter->mem // 等价于 (*iter).mem
++iter
--iter
iter1 == iter2
iter1 != iter2

和指针类似,可以通过解引用迭代器来获取它所指示的元素。试图解引用一个非法迭代器或者尾后迭代器都是未被定义的行为。
Case 1:

// 将 string 对象的第一个字母变为大写形式
string s("some string")
if (s.begin() != s.end()) // 检查 s 是否为空
{
	auto it = s.begin();
	*it = toupper(*it);
}

Case 2:

// 将 string 对象的第一个单词变为大写形式
string s("some string")
for (auto it = s.begin(); it != s.end() && !isspace(*it); ++it)
	*it = s.begin(*it);	

在 C++中,我们习惯使用 != 而非 < 进行判断,原因与我们更愿意使用迭代器而非下标一样:因为这种编程风格在标准库提供的所有容器上都有效。所有的标准库迭代器都定义来 == 和 !=,但是它们中的大多数都没有定义 < 运算符。这是一种泛型编程的思维。
4.实际上,拥有迭代器的标准库类型使用 iterator 和 const_iterator 来表示迭代器的类型。

vector<int>::iterator it;        // it 能读写 vector<int> 的元素
string::iterator it2;            // it2 能读写 string 对象中的字符
vector<int>::const_iterator it3; // it3 只能读元素,不能写元素
string::const_iterator it4;      // it4 只能读字符,不能写字符

5.迭代器这个名词有三种不同的含义:
①迭代器概念本身;②容器定义的迭代器类型;③某个迭代器对象;
我们认定某个类型是迭代器当且仅当它支持一套操作,这套操作使得我们能访问容器的元素或者从某个元素移动到另外一个元素。每个容器类定义了一个名为 iterator 的类型,该类型支持迭代器概念所规定的一套操作。
6.begin 和 end 返回的具体类型由对象是否为常量决定,有时这种默认行为并非我们所要。在对象只需读操作而无须写操作的时候,最好使用 cbegin 和 cend 固定地返回 const_iterator。
7.结合解引用和成员访问操作

// 一次输出 text 的每一行直到遇到第一个空白行为止
for (auto it = text.cbegin();
	 it != text.cend() && !it->empty(); ++it)
	cout << *it << endl;

8.谨记,凡是使用了迭代器的循环体,都不要想迭代器所属的容器添加元素。否则会使迭代器失效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值