一、迭代器有有效和无效之分,有效迭代器或者指向某个元素,或者指向容器中尾元素的下一个位置,其他所有的情况都属于无效。
二、begin成员负责返回指向第一个元素(或第一个字符)的迭代器, end成员负责返回指向容器(或string对象)尾元素的下一个位置的迭代器,也就是说,该迭代器指示的是容器的一个本不存在的尾后元素,这仅是个标记而已,表示我们已经处理完了容器中的所有元素。
三、特殊情况下,如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。
四、如果两个迭代器指向的元素相同或者都是同一个容器的尾后迭代器,则它们相等,否则说这两个迭代器不相等。
五、通过解引用迭代器来获取它所指向的元素,执行解引用的迭代器必须是合法并确实指向某个元素,所以尾后(end)迭代器不能使用解引用。
六、迭代器递增则是将迭代器向前移动一个位置,不能对尾后(end)迭代器使用递增操作符。
七、迭代器标准库类型使用iterator和const_iterator来表示迭代器的类型
八、为了便于得到const_iterator类型的返回值,c++11引入了两个新函数,cbegin和cend,不论vector对象或string对象本身是否是常量,返回值都是const_iterator。
九、判断迭代器所指的元素是否为空可以用(*it).empty(),圆括号必不可少,为了简化这个表达式,c++定义了箭头运算符(->),箭头运算符把解引用和成员访问两个操作结合在一起,即,it->empty()和(*)it.empty()表达的意思相同。
十、只要两个迭代器指向的是用一个容器中的元素或尾元素的下一个位置,就能将其相减,所得到的结果是两个迭代器的距离,所谓距离指的是右侧的迭代器向前移动多少位置就能追上左侧的迭代器,其类型为difference_type的带符号整型数,因为这个距离可正可负。
vector<string> v1 { 10 };
vector<string> v2{10, "hi" };
string str1 = "Hello world";
// end成员负责返回指向容器尾元素的下一个位置的迭代器,也就是说,该迭代器至少的是容器的一个本不存在的尾部元素
// 不能对end进行递增或解引用操作
// 和指针类似,通过解引用迭代器来获取它指向的元素
// 递增则是将迭代器向前移动一个位置
for (auto it = str1.begin(); it != str1.end(); ++it) {
cout << *it << endl;
}
// 为了便于专门得到const_iterator类型的返回值,c++11新引入了两个函数,cbegin和cend
for (auto it = str1.cbegin(); it != str1.cend(); ++it) {
cout << *it << endl;
}
for (auto it = v2.begin(); it != v2.end(); ++it) {
//(*it).empty() 圆括号必不可少
if (!(*it).empty()) {
cout << *it << endl;
}
// 为了简化(*it).empty() , c++定义了箭头运算符(->),箭头运算符把解引用和成员访问两个操作结合在一起
// it->empty()和(*it).empty()表达的意思相同
if (!it->empty()) {
cout << *it << endl;
}
}
// 迭代器二分搜索
string sought = "c";
vector<string> v3{ "a", "b", "c", "d", "e", "f", "g"};
// texts必须是有序的
auto beg = v3.begin(), end = v3.end();
// 初始状态下的中间的
auto mid = v3.begin() + (end - beg) / 2;
cout << *mid << endl;
while (mid != end && *mid != sought) {
//要找的元素是否在前半部分
if (sought < *mid) {
// 如果是,跳匝搜索范围使得忽略掉后半部分
end = mid;
}
else {
// 如果要找的元素在后半部分,在mid之后寻找
beg = mid + 1;
}
// 新的中间点
mid = beg + (end - beg) / 2;
cout << *mid << endl;
}
// 迭代器的标准库类型使用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;// it3只能读取元素,不能写字符