使用 STL 迭代器存在的问题


以一
以一 2023-12-31 03:31:28 51559 赞同 0 反对 0
分类: 资源
定义一个参数中有迭代器的函数模板会产生一个问题,我们并不总是知道在函数模板中要用到哪些类型的迭代器。思考下面用迭代器作为参数的交换函数;模板类型参数指定了迭代器类型:

使用 STL 迭代器存在的问题

定义一个参数中有迭代器的函数模板会产生一个问题,我们并不总是知道在函数模板中要用到哪些类型的迭代器。思考下面用迭代器作为参数的交换函数;模板类型参数指定了迭代器类型:

  1. template <typename Iter> void my_swap(Iter a, Iter b)
  2. {
  3. tmp = *a;//error -- variable tmp undeclared
  4. *a = *b;
  5. *b = tmp;
  6. }

函数模板的实例用来交换迭代器参数所指向的两个对象:a 和 b。dmp 应该是什么类型我们没法知道,我们知道迭代器指向对象的类型却无计可施,因为直到类模板生成实例时,才能确定对象的类型。在不知道对象的类型时,如何定义变量?当然,这里可以使用 auto。在一些情况下,我们也想知道迭代器类型的值和类型差别。

有些其他的机制可以确定一个迭代器参数所指向值的类型。一种是,坚持要求每个使用 my_swap() 的迭代器都应该包含一个公共定义的类型别名,因为这样就可以确定迭代器所指向对象的类型。既然这样,就可以在迭代器类中使用 value_type 的别名来指定函数模板 my_swap() 中 tmp 的类型,如下所示:

  1. template <typename Iter> void my_swap(Iter a, Iter b)
  2. {
  3. typename Iter::value—type tmp = *a;
  4. *a = *b;
  5. *b = tmp;
  6. }

因为 value_type 的别名定义在 Iter 类中,所以可以通过用类名限定 value_type 的方式引用它。这样定义了 value_type 别名的迭代器类就能在函数中正常使用。然而,算法既使用指针,也使用迭代器;如果 Iter 是普通类型的指针,例如 int*,甚至是 Box*,而 Box 是类型一这样可能就无法使用了。因为指针不是类,不能包含定义的别名,所以不能写成 int*::value_type 或 Box*::value_type。STL 用模板优雅地解决了这个问题和其他一些相关问题!

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
以一L0
粉丝 0 资源 1143 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  123
统信桌面专业版【全盘安装UOS系统】介绍  118
银河麒麟桌面操作系统安装佳能打印机驱动方法  109
银河麒麟桌面操作系统 V10-SP1用户密码修改  103
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益218元

3

1843880570 收益214.2元

4

IT-feng 收益209.03元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!