跳至主要內容

C++

LincZero大约 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 模板