在前面章节中,我们已经对 C++ STL标准库提供的所有容器做了系统的讲解。读者可能已经注意到,无论是序列式容器还是关联式容器(包括哈希容器),不仅模板类内部提供有 begin() 和 end() 成员方法,C++ STL 标准库中还提供有同名且具有相同功能的 begin() 和 end() 函数。

首先需要说明的是,begin() 和 end() 是以函数模板的形式定义的,但它们的模板并没有位于某一个头文件中,而是很多头文件中都有它们的定义。

C++ STL 标准库中,包含 begin() 和 end() 函数模板的头文件包括:, , , , , , (正则表达式的头文件), , , , 以及 。

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

在实际的使用场景中,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

auto begin (Container& cont)

//② 传入 const 修饰的容器,begin() 函数返回的为 const 类型的迭代器

template

auto begin (const Container& cont)

其中,cont 表示指定的容器;同时,函数会返回一个有特定指向的迭代器,且此迭代器的类型也取决于 cont 容器。

以上 2 种格式的区别仅在与传入的容器是否有 const 修饰,即如果有,则通过该函数获得的迭代器也有 const 修饰(不能用于修改容器中存储的数据);反之就没有。

举个例子:

#include // std::cout

#include // std::vector, std::begin, std::end

using namespace std;

int main() {

//创建并初始化 vector 容器

std::vector 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

T* begin (T(&arr)[N]);

其中 T 为数组中存储元素的类型,N 为数组的长度;(&arr)[N] 表示以引用的方式传递数组作为参数。

举个例子:

#include // std::cout

#include // std::vector, std::begin, std::end

using namespace std;

int main() {

//定义一个普通数组

int arr[] = { 1,2,3,4,5 };

//创建一个空 vector 容器

vector 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 数组中最后一个元素之后的位置。

java:begin_end,C++ STL begin()和end()函数用法相关推荐

  1. C++ STL begin()和end()函数(深入了解,一文学会)

    C++ STL标准库提供的所有容器做了系统的讲解.无论是序列式容器还是关联式容器(包括哈希容器),不仅模板类内部提供有 begin() 和 end() 成员方法,C++ STL 标准库中还提供有同名且 ...

  2. c++ hashset的用法_c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  3. C++STL中的unique函数解析

    一.总述 unique函数属于STL中比较常用函数,它的功能是元素去重.即"删除"序列中所有相邻的重复元素(只保留一个).此处的删除,并不是真的删除,而是指重复元素的位置被不重复的 ...

  4. c++STL中的find()函数 有两种使用方法

    c++STL中的find()函数 有两种使用方法 方法一: 开头引头文件:中的函数 其调用形式为 find(start,end,value) start搜寻的起点,end搜寻的终点,要寻找的value ...

  5. c语言中set 函数,C里边的STL里边的Set函数

    set函数的用法: 这是一个集合函数,这个函数可以处理很多的元素,这些元素可以去重,把相同的元素都去掉,剩下不一样的元素,而且还可以自动给这些元素来排序,从小到大的顺序来排序. 这里我们先来举个例子: ...

  6. java random构造方法_Java中的Random()函数及两种构造方法

    Java中存在着两种Random函数: java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是 ...

  7. 【Groovy】Groovy 代码创建 ( 使用 Java 语法实现 Groovy 类和主函数并运行 | 按照 Groovy 语法改造上述 Java 语法规则代码 )

    文章目录 一.创建 Groovy 代码文件 二.使用 Java 语法实现 Groovy 类和主函数并运行 三.按照 Groovy 语法改造上述 Java 语法规则代码 一.创建 Groovy 代码文件 ...

  8. JAVA中indexOf函数用法

    int indexOf(int ch,int fromIndex)函数:就是字符ch在字串fromindex位后出现的第一个位置.没有找到返加-1 eg:String str="a2dfcf ...

  9. java convert函数_自己实现 java中 Convert.toDouble(String str)处理函数 | 学步园

    今天在superWaba上看到Convert.toDouble(String str),由于底层问题比较大的数就出错,现在自己写了一个 程序中info()是我加的打印,可以去掉 java中 Conve ...

  10. C++标准库函数begin和end函数

    主要的目的 为了让指针更加简单.安全,引入了begin和end函数,这两个函数和容器中两个同名的成员函数类似.但是由于数组毕竟不是类类型,因此这两个函数不是成员函数. 正确的使用形式就是将数组作为他们 ...

最新文章

  1. Linux环境PHP5.5以上连接SqlServer2008【全网最经典无错版】
  2. 关于swing的一些看法
  3. [转] 利用jemalloc分析内存泄漏
  4. ahp层次分析法matlab代码_Matlab数据分析实战,基于AHP高校食堂满意度调查分析
  5. windows虚拟多桌面常用软件调研
  6. NVIDIA PhysX宣布正式开源 最强物理仿真引擎
  7. 看这里!带你快速体验MindSpore V1.0(For ubuntu 18.04)
  8. Seata术语_以及工作原理---微服务升级_SpringCloud Alibaba工作笔记0057
  9. 别再用代码开发了,整理了30套实用可视化大屏模板,无套路直接领
  10. 《软件工程(第4版?修订版)》—第2章2.9节本章对研究人员的意义
  11. 数据库树形结构、多级联动的表设计
  12. 网页websocket服务器端,node.js中ws模块创建服务端和客户端,网页WebSocket客户端
  13. 使用weui滚动加载结合php实现分类页数据列表
  14. Jquery中stop()的用法
  15. 成功解决windows系统开机时,系统提示此windows副本不是正版
  16. esxi 快照整合_ESXi删除最后的快照
  17. Flutter面试总结(2022)
  18. 在C#中使用MSMQ的方法
  19. 继电器开关性能简要对比
  20. TCP之系统调用listen()

热门文章

  1. Python 矩形积分法推荐采样点设置个数
  2. 我win10下载红警-尤里复仇黑屏,能运行,下载这个好了
  3. 计算机木材染色 配色技术的应用技术,木材怎么染色?木材染色剂电脑配色方法...
  4. 光纤交换机使用方法及应用方案详解
  5. 《当程序员的那些狗日日子》六
  6. Windows之——pid为4的system进程占用80端口的解决办法
  7. 常用邮箱的服务器(SMTP/POP3)地址和端口整理
  8. python语言创始人中文名_十大编程语言创始人,看看有没有你在用的语言?
  9. JAVA怎么打开pkg_PKG文件在电脑上怎么打开!(普通PC)
  10. 〖Python APP 自动化测试实战篇④〗- 通过 appium 驱动夜神模拟器完成第一个自动化脚本 - 查看通讯录