C++ STL begin()和end()函数用法
首先需要说明的是,begin() 和 end() 是以函数模板的形式定义的,但它们的模板并没有位于某一个头文件中,而是很多头文件中都有它们的定义。
不仅如此,begin() 和 end() 都位于 std 名空间中。因此,在使用这 2 个函数之前,程序中应引入容纳它们函数模板的头文件以及 std 名空间。C++ STL 标准库中,包含 begin() 和 end() 函数模板的头文件包括:<iterator>, <array>, <deque>, <forward_list>, <list>, <map>, <regex>(正则表达式的头文件), <set>, <string>, <unordered_map>, <unordered_set> 以及 <vector>。
在实际的使用场景中,begin() 和 end() 函数往往会一起使用的。根据作用对象的不同,begin() 和 end() 函数可细分为以下 2 个功能。
1) begin()和end()参数为容器
当将某个具体容器(比如 cont)作为参数分别传给 begin() 和 end() 函数时,其中 begin() 底层会执行 cont.begin() 语句,而 end() 底层会执行 cont.end() 语句,它们最终会将得到的迭代器作为函数的返回值反馈回来。当作用对象为容器时,end() 和 begin() 函数的语法格式是完全一样的,这里以 begin() 函数为例,有以下 2 种格式:
//① 非 const 修改的容器作为参数,begin() 函数返回的为非 const 类型的迭代器
template <class Container>
auto begin (Container& cont)
//② 传入 const 修饰的容器,begin() 函数返回的为 const 类型的迭代器
template <class Container>
auto begin (const Container& cont)
其中,cont 表示指定的容器;同时,函数会返回一个有特定指向的迭代器,且此迭代器的类型也取决于 cont 容器。
以上 2 种格式的区别仅在与传入的容器是否有 const 修饰,即如果有,则通过该函数获得的迭代器也有 const 修饰(不能用于修改容器中存储的数据);反之就没有。
举个例子:
#include <iostream> // std::cout
#include <vector> // std::vector, std::begin, std::end
using namespace std;
int main() {
//创建并初始化 vector 容器
std::vector<int> myvector{ 1,2,3,4,5 };
//调用 begin() 和 end() 函数遍历 myvector 容器
for (auto it = begin(myvector); it != end(myvector); ++it)
cout << *it << ' ';
return 0;
}
程序执行结果为:
1 2 3 4 5
程序第 8 行中,begin(myvector) 等同于执行 myvector.begin(),而 end(myvector) 也等同于执行 myvector.end()。2) begin()和end()参数为数组
除了可以将指定容器作为参数传给 begin() 和 end() 之外,还可以指定数组作为参数传给它们。将指定数组传给 begin() 函数,其会返回一个指向该数组元素的指针;将指定数组传给 end() 函数,其会返回一个指向数组中一个元素之后位置的指针。
同样,数组作为参数时,end() 函数的语法格式和 begin() 函数也完全一样,这里仅给出了 begin() 函数的语法格式:
template <class T, size_t N>
T* begin (T(&arr)[N]);
其中 T 为数组中存储元素的类型,N 为数组的长度;(&arr)[N] 表示以引用的方式传递数组作为参数。举个例子:
#include <iostream> // std::cout
#include <vector> // std::vector, std::begin, std::end
using namespace std;
int main() {
//定义一个普通数组
int arr[] = { 1,2,3,4,5 };
//创建一个空 vector 容器
vector<int> myvector;
//将数组中的元素添加到 myvector 容器中存储
for (int *it = begin(arr); it != end(arr); ++it)
myvector.push_back(*it);
//输出 myvector 容器中存储的元素
for (auto it = myvector.begin(); it != myvector.end(); ++it)
cout << *it << ' ';
return 0;
}
程序执行结果为:
1 2 3 4 5
注意程序中第 10 行,这里用整数指针 it 接收 begin(arr) 的返回值,同时该循环会一直循环到 it 指向 arr 数组中一个元素之后的位置。
- 随机文章
- 增城市马尔代夫(增城市打造现代化马尔代夫旅游海岛闪亮登场)
- 东台马尔代夫广告(东台旅行社推出马尔代夫特惠旅游活动)
- 印度领土马尔代夫(印度重视其在马尔代夫的领土新闻梳理)
- 亚洲 马尔代夫 时间(马尔代夫珊瑚岛上的亚洲境地)
- 去马尔代夫防晒霜(防晒重要,去马尔代夫别忘携带防晒霜)
- 去马尔代夫要筹备(如何准备去马尔代夫旅行?重要提示!)
- 怀旧马尔代夫图片(复古马尔代夫图片:带你回到时光隧道)
- 日本轰炸马尔代夫(日本轰炸马尔代夫:历史中的残暴一幕)
- 快艇 马尔代夫(快艇探寻马尔代夫风光)
- 南安马尔代夫球赛(南安联队与马尔代夫队在友谊赛中交锋)
- 歌词 马尔代夫(度假天堂在地球:探索马尔代夫)
- 居家马尔代夫长裙(如何在家穿着长裙仿佛身在马尔代夫?)
- 树上餐厅马尔代夫(马尔代夫树上餐厅:与大自然共进美食)
- 金华 马尔代夫(金华游客赴马尔代夫旅游需注意事项)
- 熟女马尔代夫外拍(熟女风情万种,马尔代夫私拍大片曝光)
- 宜都马尔代夫位置(宜都度假村:尽情享受马尔代夫美景!)
- 环海赶海马尔代夫(环保旅行:一次马尔代夫海洋环保之旅)
- 草坝 马尔代夫(后的:草坝岛:避暑胜地 ~ 马尔代夫~)
- 西班牙和马尔代夫(西班牙和马尔代夫的旅游业正在恢复中)
- 春节 马尔代夫(新年马尔代夫:春节体验海岛豪华之旅!)
- 信阳北湖马尔代夫(信阳北湖——探秘中国版“马尔代夫”)
- 赞美马尔代夫文苑(马尔代夫文学艺术之美,令人赞叹不已)
- 锦州马尔代夫图片(锦州逼真马尔代夫场景惊艳,美不胜收)
- 疫情 马尔代夫(马尔代夫出现新一轮疫情,引发全国警惕)
- 心中 马尔代夫(舒适温馨:走进马尔代夫的小岛生活)
- 夫妻遇害马尔代夫(夫妇在马尔代夫遇害,调查正在进行中)
- 中国 马尔代夫 苏州(中国、马尔代夫和苏州:三地旅游胜地)
- 盱眙 马尔代夫(盱眙县:马尔代夫爱好者的天堂)
- 长征五号马尔代夫(长征五号成功将马尔代夫卫星送入太空)
- 西沙吊打马尔代夫(西沙岛亚洲海洋霸主,锤炼马尔代夫!)
