此文为阅读笔记,内容基本出自书中。
1. 基本概念
使用下标访问对象的成员的最基本方法有三种:string对象的字符访问,vector对象的元素访问,迭代器。
迭代器类似于指针类型,也提供了对对象的间接访问。使用迭代器可以访问某个元素,也能从一个元素移动到另外一个元素。迭代器分为有效和无效,有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一个位置,其他所有情况都属于无效。
2. 使用迭代器
有迭代器的类型都拥有名为begin和end的成员,其中begin成员负责返回指向第一个元素或第一个字符的迭代器;end成员则负责返回指向容器(或string对象)尾元素的下一个位置的迭代器,这个迭代器被称作尾后迭代器或者简称为尾迭代器,并没有实际含义,仅作为已经处理完成容器中的所有元素的标记。
若容器为空时,begin和end返回的是同一个迭代器。
begin和end返回的具体类型由对象是否为常量决定,如果对象是常量,则返回const_iterator;如果对象不是常量,则返回iterator。作者建议对于只需读操作而不需写操作最好使用常量类型,C++11引入的cbegin和cend函数用于专门得到const_iterator类型的返回值,无论对象本身是否为常量。
2.1 修改字符串
要求:将string对象中的第一个字母修改为大写形式。
实现代码:
#include <iostream>
int main(void) {
std::string s("hello world!");
if (s.begin() != s.end()) {
auto it = s.begin();
*it = toupper(*it);
}
std::cout << s << std::endl;
return 0;
}
输出效果:
Hello world!
2.2 移动元素
要求: 将string对象中的第一个单词改写为大写形式。
实现代码:
#include <iostream>
int main(void) {
std::string s("hello world!");
for (auto it = s.begin(); (it != s.end() && !isspace(*it)); ++it) {
*it = toupper(*it);
}
std::cout << s << std::endl;
return 0;
}
实现效果:
HELLO world!