irpas技术客

C++ STL begin()和end()函数(深入了解,一文学会)_双子座断点_c++ end()

大大的周 1859

???????? C++ STL标准库提供的所有容器做了系统的讲解。无论是序列式容器还是关联式容器(包括哈希容器),不仅模板类内部提供有 begin() 和 end() 成员方法,C++ STL 标准库中还提供有同名且具有相同功能的?begin() 和 end() 函数。 首先需要说明的是,begin() 和 end() 是以函数模板的形式定义的,但它们的模板并没有位于某一个头文件中,而是很多头文件中都有它们的定义。

C++ STL 标准库中,包含 begin() 和 end() 函数模板的头文件包括:<iterator>, <array>, <deque>, <forward_list>, <list>, <map>, <regex>(正则表达式的头文件), <set>, <string>, <unordered_map>, <unordered_set> 以及 <vector>。

不仅如此,begin() 和 end() 都位于 std 命名空间中。因此,在使用这 2 个函数之前,程序中应引入容纳它们函数模板的头文件以及 std 命名空间。

??本文作者原创,转载请附上文章出处与本文链接。

?C++ STL begin()和end()函数(深入了解,一文学会)目录

1 begin()和end()参数为容器

2?begin()和end()参数为数组


在实际的使用场景中,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> // cout #include <vector> // vector, begin, end using namespace std; //创建并初始化 vector 容器 vector<int> myvector{ 1,2,3,4,5 }; //调用 begin() 和 end() 函数遍历 myvector 容器 for (auto it = begin(myvector); it != end(myvector); ++it) cout << *it << ' ';

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; //创建并初始化 vector 容器 vector<int> myvector{ 1,2,3,4,5 }; //调用 begin() 和 end() 函数遍历 myvector 容器 for (auto it = begin(myvector); it != end(myvector); ++it) cout << *it << ' ';

?这里用整数指针 it 接收 begin(arr) 的返回值,同时该循环会一直循环到 it 指向 arr 数组中最后一个元素之后的位置。

以下博客部分内容借鉴自:http://c.biancheng.net/stl/。

C++ STL 容器、迭代器、适配器(深入了解,一文学会)??? https://blog.csdn.net/qq_37529913/article/details/120052137??????????????????????????????????????????????????????????????????????????????? C++ STL deque容器(深入了解,一文学会)?????????????????????? https://blog.csdn.net/qq_37529913/article/details/118676574 C++ STL vector容器(深入了解,一文学会)?????????????????????? https://blog.csdn.net/qq_37529913/article/details/118676109 C++ STL list容器(深入了解,一文学会)???????????????????????????? https://blog.csdn.net/qq_37529913/article/details/118676917 C++ STL forward_list容器(深入了解,一文学会)?????????????? https://blog.csdn.net/qq_37529913/article/details/118687348 C++ STL array 容器(深入了解,一文学会)??????????????????????? https://blog.csdn.net/qq_37529913/article/details/118688364 C++ STL pair 类模板(深入了解,一文学会)?????????????????????? https://blog.csdn.net/qq_37529913/article/details/118714852 C++ STL map容器(深入了解,一文学会)?????????????????????????? https://blog.csdn.net/qq_37529913/article/details/118741670 C++ STL map emplace()和emplace_hint()(深入了解,一文学会)???????? https://blog.csdn.net/qq_37529913/article/details/118771777 C++ STL multimap容器(深入了解,一文学会)??????????????????? https://blog.csdn.net/qq_37529913/article/details/118773021 C++ STL Set容器(深入了解,一文学会)???????????????????????????? https://blog.csdn.net/qq_37529913/article/details/118918940 C++ STL multiset容器(深入了解,一文学会)????????????????????? https://blog.csdn.net/qq_37529913/article/details/119624779 C++ STL unordered_map容器(深入了解,一文学会)???????? https://blog.csdn.net/qq_37529913/article/details/119689199 C++ STL unordered_set容器(深入了解,一文学会)?????????? https://blog.csdn.net/qq_37529913/article/details/119709019 C++ STL unordered_multiset容器(深入了解,一文学会)??? https://blog.csdn.net/qq_37529913/article/details/119709079 C++ STL stack容器适配器(深入了解,一文学会)??????? https://blog.csdn.net/qq_37529913/article/details/119723782 C++ STL queue容器适配器(深入了解,一文学会)?????? https://blog.csdn.net/qq_37529913/article/details/119746246 C++ STL priority_queue容器适配器(深入了解,一文学会)??????????????? https://blog.csdn.net/qq_37529913/article/details/119770527 C++ STL reverse_iterator反向迭代器适配器(深入了解,一文学会)?? https://blog.csdn.net/qq_37529913/article/details/119814820 C++ STL insert_iterator插入迭代器适配器(深入了解,一文学会)????? https://blog.csdn.net/qq_37529913/article/details/119834378 C++ STL stream_iterator流迭代器(深入了解,一文学会)????????????????? https://blog.csdn.net/qq_37529913/article/details/119834429 C++ STL streambuf_iterator流缓冲区迭代器(深入了解,一文学会)??????? https://blog.csdn.net/qq_37529913/article/details/119850048 C++ STL move_iterator移动迭代器(深入了解,一文学会)????????????????????? https://blog.csdn.net/qq_37529913/article/details/119859888 C++ STL advance()函数(深入了解,一文学会)??????? https://blog.csdn.net/qq_37529913/article/details/120008250 C++ STL distance()函数(深入了解,一文学会)??????? https://blog.csdn.net/qq_37529913/article/details/120008300 C++ STL iterator迭代器(深入了解,一文学会)???????? https://blog.csdn.net/qq_37529913/article/details/120008346 C++ STL const_iterator转换为iterator类型迭代器(深入了解,一文学会)??????? https://blog.csdn.net/qq_37529913/article/details/120008324 C++ STL begin()和end()函数(深入了解,一文学会)??????? https://blog.csdn.net/qq_37529913/article/details/120008459 C++ STL prev()和next()函数(深入了解,一文学会)???????? https://blog.csdn.net/qq_37529913/article/details/120008481 ?


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #C #END #begin #