有关迭代器及其类型的介绍,可以阅读《C++ STL迭代器(iterator)》一节,本节不再做具体介绍。
成员函数 | 功能 |
---|---|
begin() | 返回指向容器中第一个元素的正向迭代器;如果是 const 类型容器,在该函数返回的是常量正向迭代器。 |
end() | 返回指向容器最后一个元素之后一个位置的正向迭代器;如果是 const 类型容器,在该函数返回的是常量正向迭代器。此函数通常和 begin() 搭配使用。 |
rbegin() | 返回指向最后一个元素的反向迭代器;如果是 const 类型容器,在该函数返回的是常量反向迭代器。 |
rend() | 返回指向第一个元素之前一个位置的反向迭代器。如果是 const 类型容器,在该函数返回的是常量反向迭代器。此函数通常和 rbegin() 搭配使用。 |
cbegin() | 和 begin() 功能类似,只不过其返回的迭代器类型为常量正向迭代器,不能用于修改元素。 |
cend() | 和 end() 功能相同,只不过其返回的迭代器类型为常量正向迭代器,不能用于修改元素。 |
crbegin() | 和 rbegin() 功能相同,只不过其返回的迭代器类型为常量反向迭代器,不能用于修改元素。 |
crend() | 和 rend() 功能相同,只不过其返回的迭代器类型为常量反向迭代器,不能用于修改元素。 |
C++ 11 新添加的 begin() 和 end() 全局函数也同样适用于 deque 容器。即当操作对象为 deque 容器时,其功能分别和表 1 中的 begin()、end() 成员函数相同,具体用法本节后续会做详细介绍。
值得一提的是,以上函数在实际使用时,其返回值类型都可以使用 auto 关键字代替,编译器可以自行判断出该迭代器的类型。
#include <iostream> #include <deque> using namespace std; int main() { deque<int>d{1,2,3,4,5}; //从容器首元素,遍历至最后一个元素 for (auto i = d.begin(); i < d.end(); i++) { cout << *i << " "; } return 0; }运行结果为:
1 2 3 4 5
for (auto i = begin(d); i < end(d); i++) { cout << *i << " "; }重新编译运行程序,会发现输出结果和上面一致。
#include <iostream> #include <deque> using namespace std; int main() { deque<int>d{1,2,3,4,5}; auto first = d.cbegin(); auto end = d.cend(); //常量迭代器不能用来修改容器中的元素值 //*(first + 1) = 6;//尝试修改容器中元素 2 的值 //*(end - 1) = 10;//尝试修改容器中元素 5 的值 //常量迭代器可以用来遍历容器、访问容器中的元素 while(first<end){ cout << *first << " "; ++first; } return 0; }运行结果:
1 2 3 4 5
程序中,由于 first 和 end 都是常量迭代器,因此第 10、11 行修改容器内元素值的操作都是非法的。反向迭代器用于以逆序的方式遍历容器中的元素。例如:需要注意的是,在使用反向迭代器进行 ++ 或 -- 运算时,++ 指的是迭代器向左移动一位,-- 指的是迭代器向右移动一位,即这两个运算符的功能也“互换”了。
#include <iostream> #include <deque> using namespace std; int main() { deque<int>d{1,2,3,4,5}; for (auto i = d.rbegin(); i < d.rend(); i++) { cout << *i << " "; } return 0; }运行结果为:
5 4 3 2 1
#include <iostream> #include <vector> using namespace std; int main() { vector<int>values; auto first = values.begin(); //*first = 1; return 0; }
对于空的 deque 容器来说,可以通过 push_back()、push_front() 或者 resize() 成员函数实现向(空)deque 容器中添加元素。
#include <iostream> #include <deque> using namespace std; int main() { deque<int>d; d.push_back(1); auto first = d.begin(); cout << *first << endl; //添加元素,会导致 first 失效 d.push_back(1); cout << *first << endl; return 0; }程序中第 12 行代码,会导致程序运行崩溃,其原因就在于在创建 first 迭代器之后,deque 容器做了添加元素的操作,导致 first 失效。
在对容器做添加元素的操作之后,如果仍需要使用之前以创建好的迭代器,为了保险起见,一定要重新生成。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有