前言
大二暑假那年,闲着没事翻看了一本C++的教材,忘了书名叫啥了。因为翻看过C++,所以开学的时候没有选修这门课。后来为了考CCF,了解了容器的使用。再后来,大四那年,闲着没事,翻看了半本《C++ primer》。比较零碎,这个暑假以C++为专题,梳理下。
我先计划了一个星期的解设计模式:设计模式-笔记
再计划18天来了解下STL与泛型编程(期间玩了11天,余下七天学习,2021/8/9修):C++标准库(STL)与泛型编程
之后,去github上找个简单的C++小游戏源码阅读以收尾。
这篇博客的附录是重点。
C++ 六大部件
我们需要弄明白下面这张图的含义。
容器用以存储数据结构;算法通过迭代器操作容器;分配器用以管理代码相关内存;适配器的原理是适配器模式,将已有的接口转换成我们需要的接口。
仿函数是什么?我们google下,阅读C++ 仿函数可知:仿函数重写operator() 运算符,使类可以像函数一样使用。好处是其可以像函数一样使用,但是可以拥有自己的私有数据。
上面的代码我敲了一遍,我们一点点看。
#include <iostream>
#include <vector>
#include <memory>
#include <functional>
#include <algorithm>
using namespace std;
int main(void){
int tmp[] = {1,2,3,4,5,6};
vector<int,allocator<int>> vec(tmp,tmp+sizeof(tmp)/sizeof(tmp[0]));
cout<<count_if(vec.begin(),vec.end(),not1(bind2nd(less<int>(),2)))<<endl;
return 0;
}
首先,C++中遇见不清楚的内容,可以参考附录的方法。
-
仿函数
less<int>()
std::less 用于比较两个对象的大小,返回bool型结果。
-
其他内容自行阅读: std::bind2nd、std::not1、std::count_if、std::vector、std::allocator
附录
C++常用的官方网站:isocpp、cplusplus.com - C++、cppreference.com-zh、gun-libstdc++: Containers 、Microsoft C++标准库、llvm libc++
查手册,一般去官网查看,因为权威标准;查问题/缘由,我一般直接google,因为相对于官网的说明书,博客逻辑性比好。下面,我简述下上面几个C++站点的区别。
- isocpp:包含C++标准和标准化过程的信息。如果想要溯源了解某些问题,标准的查必不可少。
- cplusplus.com - C++:一个包含有关 C++ 语言的一般信息、参考、教程和文章部分的站点。(我习惯性用这个站点来查看标准库的使用信息)
- cppreference.com-zh:一个网站,主要关注完整的标准模板库参考、技术规范和选定的非 ANSI/ISO 库列表。
- gun-libstdc++: Containers:GCC中实现的C++标准库。其对应的代码在gcc-mirror/gcc
- Microsoft C++标准库:微软实现的C++标准库。其对应的代码在microsoft/STL
- llvm libc++:llvm对于C++标准库的实现。其对应的代码在llvm-project/libcxx
同一个C++标准可以有不同的实现。关于如何获取不同实现的C++标准库,可以参考如何获取 C++ 标准库的源码
上面列出了C标准库的三种实现。我当前的系统是Ubuntu20,同时安装了gcc和clang/llvm。我分别使用clang++ -v
和g++ -v
编译相同C++程序,查看编译过程。我看到C++标准库在使用的时候,库代码都位于头文件/usr/include/c++
中。 查看头文件里面的注释,可以看到头文件是GCC中实现的C++标准库。
遗留问题:clang/llvm实现的C++标准库和gcc实现的C++标准库区别。