C++
大约 2 分钟
C++
目录
OOP vs GP
比较
数据和方法的区别
OOP的目的是将数据和方法绑定在一起
- 例如对
std::list
容器进行排序要调用std::list::sort
方法
- 例如对
GP的目的是将数据和方法分离开来
- 例如对
std::vector
容器进行排序要调用std::sort
方法
- 例如对
OOP(Object-Oriented Programming)
OOP企图将 datas 和 methods 关联在一起
类定义
/* list类 */
template <class T, class Alloc=alloc>
class list {
//...
void sort();
};
- Q:引申问题:为什么list不能用
::sort
排序 - A:
std::sort
的实现使用了随机访问,而list不能随机访问,不能用::sort
排序
GP(Generic Programming)
标准库使用GP编程
GP却是将 datas 和 methods 分开来
类定义(这两个容器都提供 RandomAccessIterator 随机遍历器)
/* vector类 */
template <class T, class Alloc=alloc>
class vector {
//...
//(没有sort方法)
};
/* deque类 */
template <class T, class Alloc=alloc, size_t BufSiz=0>
class deque {
//...
//(没有sort方法)
};
算法 Algorithms(排序)
template<typename _RandomAccessIterator>
inline void sort(_RandomAccessIterator __first, _RandomAccessIterator __last) {
// std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
}
template<typename _RandomAccessIterator, typename _Compare>
inline void sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) {
if (__first != __last) {
std::__introsort_loop(__first, __last,
std::__lg(__last - __first) * 2, // 对iterator进行减运算,std::list的iterator没有实现该运算
__comp);
std::__final_insertion_sort(__first, __last, __comp);
}
}
GP 补充
好处
- Containers 和 Algorithms 团队可以各自开发,其间以Iterator沟通即可
- Algorithms 通过 Iterator 确定操作范围,并通过Iterator取用Container元素
组件结构
图示
复习下六组件结构
操作符重载 vs 模板(泛化、全特化、偏特化)
Operator Overloading 操作符重载
略
Templates 模板
略