STL源码剖析(迭代器)

在STL中,容器跟算法是分开设计的,算法是通过迭代器来对容器进行操作的。

在算法运用迭代器的时候,可能会用到其相应的型别,例如返回值为容器中元素的型别,又或者说根据迭代器的类型来选择更好的算法等等。

为了实现这一点,还有为了兼容内置型别的迭代器(vector迭代器直接使用原生pointer),STL使用了traits技法,用于提取迭代器的特性(相应的型别)。

 

1.首先在iterator中typedef相应的型别

 1 // 这是迭代器的基类 所有迭代器必须定义这5种型别
 2 template<class Category, class T, class Distance = ptrdiff_t,
 3 class Pointer = T*, class Reference = T&>
 4 struct iterator {
 5     typedef Category iterator_category;
 6     typedef T value_type;
 7     typedef Distance difference_type;
 8     typedef Pointer pointer;
 9     typedef Reference reference;
10 };
View Code

2.定义萃取器iter_traits

1 // 以迭代器为模板参数,用于萃取相应的型别
2 template <class Iterator>
3 struct iter_traits {
4     typedef typename Iterator::iterator_category iterator_category;
5     typedef typename Iterator::value_type value_type;
6     typedef typename Iterator::difference_type difference_type;
7     typedef typename Iterator::pointer pointer;
8     typedef typename Iterator::reference reference;
9 };
View Code

3.定义相应的偏特化版本(这就是为什么要使用iter_traits封装多一层),因为内置型别的迭代器并不是class,不能定义相应的型别。

 1 // 原生指针的偏特化版
 2 template <class T>
 3 struct iter_traits<T*> {
 4     typedef typename random_access_iter_tag iterator_category;
 5     typedef typename T value_type;
 6     typedef typename ptrdiff_t difference_type;
 7     typedef typename T* pointer;
 8     typedef typename T& reference;
 9 };
10 
11 // 原生const的偏特化版
12 template <class T>
13 struct iter_traits<const T*> {
14     typedef typename random_access_iter_tag iterator_category;
15     typedef typename T value_type;
16     typedef typename ptrdiff_t difference_type;
17     typedef typename const T* pointer;
18     typedef typename const T& reference;
19 };
View Code

4.5种迭代器类型,只是一个标志,用于根据萃取出来的iterator_category来选择相应的算法。

1 struct input_iter_tag {};
2 struct output_iter_tag {};
3 struct forward_iter_tag : public input_iter_tag {};
4 struct bidirectional_iter_tag : public forward_iter_tag {};
5 struct random_access_iter_tag  : public bidirectional_iter_tag {};
View Code

 

下面是distance()的实现,展示了怎么使用traits萃取相应的型别。

 1 // input迭代器只支持operator++
 2 template<class InputIterator>
 3 inline typename iter_traits<InputIterator>::difference_type
 4 __distance(InputIterator first, InputIterator last, input_iter_tag)
 5 {
 6     iter_traits<InputIterator>::difference_type n = 0;
 7     while (first != last)
 8     {
 9         first++;
10         n++;
11     }
12     return n;
13 }
14 
15 // random access迭代器支持迭代器之间的加减法
16 template<class RandomAccessIterator>
17 inline typename iter_traits<RandomAccessIterator>::difference_type
18 __distance(RandomAccessIterator first, RandomAccessIterator last, random_access_iter_tag)
19 {
20     return last - first;
21 }
22 
23 // 根据迭代器的iterator_category来调用适合的版本
24 template<class Iterator>
25 inline typename iter_traits<Iterator>::difference_type
26 distance(Iterator first, Iterator last)
27 {
28     return __distance(first, last, iter_traits<Iterator>::iterator_category());
29 }
View Code

 

 

STL的__type_traits也是使用traits技法,它可以萃取一个class是否有不重要的构造函数、是否为POD类型等等。

 1 // __type_traits也是运用traits技术
 2 struct __true_type {};
 3 struct __false_type {};
 4 
 5 template <class type>
 6 struct __type_traits {
 7     // 默认为false  可以实现自己的偏特化版本
 8     // 内置类型的偏特化版本定义在stl_config.h中  都是__true_type
 9     typedef __false_type    has_trivial_default_constructor;
10     typedef __false_type    has_trivial_copy_constructor;
11     typedef __false_type    has_trivial_assignment_operator;
12     typedef __false_type    has_trivial_destructor;
13     typedef __false_type    is_POD_type;
14 };
View Code

自定义的类型可以定义相应的偏特化版本,例如定义is_POD_type为__true_type,STL会在元素析构的时候只进行内存回收,而不调用析构函数以用来提高效率。

 

内存基本处理工具

STL定义了五个全局函数,作用于未初始化空间上,同样的它们也是使用了traits技法。

1.construct()跟destroy(),它们定义在stl_construct.h中

2.uninitialized_copy()、uninitialized_fill()、uninitialized_fill_n(),它们定义在stl_uninitialized中

 

转载于:https://www.cnblogs.com/runnyu/p/5988383.html

内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参数与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值