C++ Standard Library
C++ Standard Library
*注:内容主要是对参考1的学习记录,知识点与图片大都来源于该书,
部分知识点与图片来源于参考2。具体参考信息,见最下方参考。*
C++98中新支持的语言特性
- 非类型模板参数
template<std::size_t N> class bitset;
。 - 模板类中的默认模板参数
template<typename T, typename Allocator = std::allocator<T>> calss vector
。 - 关键字typename用来表示随后的标识符是一个类型。
- 支持类的成员函数是成员模板函数,然而该成员函数不能是虚函数。
- 支持嵌套类模板。
- 基本类型的显示初始化
int x = int();
,该特性可以确保模板代码中任意类型的值都有一个初始化的默认值。
C++11中新支持的语言特性
- 模板尖括号之间不再需要空格符了,
vector<list<int>> // since c++11
- 关键字
nullptr // since c++11
- 关键字
auto // since c++11
,自动类型推导,从变量的初始化器中推导出该变量的类型。 - c++11支持统一的初始化形式,使用大括号。注意的是,{}初始化不能进行类型缩小转换。例如
int x{2.0}; // is wrong
。 - c++11支持初始化列表,如
int std::vector<int> v{2, 3, 4, 65}; // initializer list
。注意,如果一个类声明了
显示构造函数,则不可使用初始化列表。 - c++11支持foreach循环。
- c++11支持移动语义和右值引用,简单的说就是值传递的过程中不用再copy了,而是直接使用该值。
namespace std {template<typename T, ...> class set {public:... insert(const T& x); // for lvalues, copies the value... insert(T&& x); // for rvalues, moves the value};
}
- 返回一个非静态的局部对象的右值引用时错误的。
- c++11支持原生字符串(raw string)和多字节/宽字节字符串(multibyte/wide-character string)。
R"(\\n)"; // raw string, begin with R(", and end with )"
。为了能够在原生字符串中使用)"
,需要使用
分隔符。原生字符串的完整语法是R"delim(...)delim"
,其中delim是一个至多16个基本字符的字符序列,并且delim中
不能有反斜杠backslash,空白符whitespaces,与括号parentheses。如:
R"nc(a\b\nc()")nc";//等价于
"a\\\n b\\nnc()"\n "
多字节/宽字节字符串字面值
u8定义UTF-8字符串字面值
u定义cha16_t字符串字面值
U定义char32_t字符串字面值
L定义wchar_t字符串字面值
c++提供关键帧noexcept,指定一个函数不会抛出异常或不准备抛出异常,有异常必须在函数中处理完。c++异常规范是在
运行时检查,而不是在编译时检查异常。运行时检查异常需要编译器产生额外的代码,从而可能会妨碍编译器优化。在泛型代码中,
很难知道对模板参数的操作会产生什么样的异常。关键字
constexpr
使表达式能过在编译期被计算出来。c++11支持可变参数模板。
template<typename T, typename... Types>
void Test(T& x, Types& ... args) {...
}
在变参模板内,使用sizeof…(args),会返回参数的数目。
- c++11使用模板的别名
template<typename T>
using Vec = std::vector<T>;
Vec<int> vec;
// 等价于
std::vector<int> vec;
c++11函数模板支持默认模板参数;c++11支持局部类型作为模板参数;c++11支持内部链接的函数
作为非类型模板的函数指针或函数引用。c++11支持Lambda表达式。
[capture-list] (params) mutable exception attribute -> ret {body}
capture-list: 逗号分割的捕获列表,[a, &b]a以值的形式被捕获,b以引用的形式被捕获;[this]以值的形式
捕获this指针;[&]以引用的形式捕获所有的自动变量;[=]以值的形式捕获所有的自动变量;[]不捕获任何值。c++11支持关键字decltype,编译器可以推导出表达式的类型。
新的函数声明语法
template<typename T1, typename T2>
auto add(T1 x, T2 y) -> decltype(x + y);
支持作用域枚举(这个是我搞错了,作用域枚举是c++98/03就支持的)
enum struct|class name {enumerator = constexpr, enumerator = constexpr, ...};
enum struct|class name : type {enumerator = constexpr, enumerator = constexpr, ...};
- c++11支持新的基本数据类型:
char16_t
,char32_t
,long long
,std::nullptr_t
C++中都有哪些命名空间
std
std::tr1
std::rel_ops
std::chrono
std::placeholders
std::regex_constants
std::this_thread
std::posix // 未使用,保留
C++异常继承框架
语言级支持的异常类
bad_cast:定义在头文件<typeinfo>
中。在运行时,dynamic_cast将一个类型转换为引用类型失败时,抛出该异常。
bad_typeid:定义在头文件<typeinfo>中
。在运行时,typeid的参数是0或者是null指针时,抛出该异常。
bad_exception:定义在头文件<exception>中
,用来处理不可预料的异常错误。当函数抛出了一个异常,而该异常不在异常规范列表中时,
会调用unexpected()函数抛出bad_exception异常。注意,c++11中已经不推进使用异常规范了。
逻辑错误(logic_error)
domain_error, invalid_argument, length_error, out_of_range(定义在头文件<stdexcept>
);
future_error(定义在头文件<future>
, c++11新支持的异常类)。
运行时错误(runtime_error)
range_error:范围错误,计算的结果不能由目的类型所完成表示。在c++标准库中只有std::wstring_convert::from_bytes
和
std::wstring_convert::to_bytes
会抛出该异常。定义在头文件<stdexcept>
overflow_error:用来报告算术运算溢出(上溢)错误,在标准库中只有std::bitset::to_ulong
和std::bitset::to_ullong
会抛出该异常。定义在头文件<stdexcept>
underflow_error:定义在头文件<stdexcept>
system_error:用来报告有操作系统引起的错误,该异常的抛出通常是由并发操作所引起的,从c++11开始支持。
定义在头文件<system_error>
。
bad_alloc:由全局new操作符引起的异常错误,定义在头文件<new>
中。
bad_array_new_length:继承自bad_alloc,从c++11开始提供的异常类,用new分配一块内存时,大小超出了实现所定义的大小限制时,
会抛出该异常。
bad_weak_ptr:定义在头文件<memory>
,c++11开始支持。当由std::weak_ptr
转换为std::share_ptr
,而std::weak_ptr
所指向的对象已经删除了,会抛出该异常。
bad_function_call:定义在头文件<functional>
,c++11开始支持。当函数对象为空对象时,调用该对象,由
std::function::operator()
抛出该异常。
Callable
Callable类型是可以触发某些操作的类型,定义在std::function, std::bind, std::thread::thread
,一个Callable对象可以是
一个函数对象,指向函数的指针,函数的引用,指向成员函数的指针,或者是指向数据成员的指针。
Utilities
template<typename T1, typename T2> struct pair;
(<pair>
)
template<typename... Types> class tuple;
(<tuple>
)
template<typename T, typename Deleter=std::default_delete<T>> class unique_ptr;
(<memory
)
template<typenameT, typname Deleter> class unique_ptr<T[], Deleter>
(<memory
)
template<typname T> class shared_ptr;
(<memory
)
template<typename T> class weak_ptr;
(<memory
)
注意在某一时刻只能有一组shared pointers拥有某个对象,也就是说不能改对象构造多个shared_ptr对象,
只能用该对象的shared_ptr对象去构造新的shared_ptr对象。
template<typename T> class enable_shared_from_this;
(<memory
)
template<typename T> struct default_delete;
(<memory
)
template<typename T> struct default_delete<T[]>;
(<memory
)
基本数据类型的最小大小:char 1, short int 2, int 2, long int 4, long long int 8, float 4, double 8, long double 8;
template<typename T> class numeric_limits;
(<limits>
)
注意c++11新增的头文件<type_traits>
提供的编译时类型信息。
template<typename T> typename std::add_rvalue_reference<T>::type declval()
引用包装器:reference_wrapper (<functional>
)
函数包装器:function(<functional>
)
<algorithm>
中提供了很多只读序列的操作,可写序列的操作,分割操作,排序操作,二分查找操作,集合操作,堆操作,求最大最小值操作。
注意,remove并没有实际删除元素,只是将迭代器的指针向前移动来跳过remove的元素,所以原容器的大小并没改变,remove将返回新的尾部迭代器。
c++11提供了编译时的分数算术运算<ratio>
。
c++11提供了新的时钟标准库<chrono>
The Standard Template Library
容器(containers) 迭代器(iterators) 算法(algortithms)
STL将数据与对数据的操作相分离,数据由容器来管理,操作由算法来完成,通过迭代器来连接算法与容器。
STL容器分类:
序列容器:array,vector,deque,list,forward_list。通常由数组与链表实现。
关联容器:set, multiset, map, multimap。通常由红黑树实现。
无序关联容器:unordered_set, unordered_multiset, unordered_map, unordered_multimap。通常由哈希表实现。
容器适配器:stack,queue,priority_queue。
STL迭代器分类:
ForwardIterator, BidirectionalIterator, RandomAccessIterator
InputIterator(只能前向迭代), OutputIterator(只能前向迭代)
迭代器分类 | 功能 | 提供该迭代器的类、函数或数据结构 |
---|---|---|
OutputIterator | 前向写 | ostream,inserter |
InputIterator | 一次前向读 | istream |
ForwardIterator | 前向读 | forward_list, unordered associative containers |
BidirectionalIterator | 双向读 | list,associative containers |
RandomAccessIterator | 随机读 | array,vector,deque,string,C-style array |
流迭代器:
istream_iterator
ostream_iterator
istreambuf_iterator
ostreambuf_iterator
迭代器适配器:
类
reverse_iterator 逆序遍历
move_iterator 解引用转换右值引用
insert_iterator 插入到容器
back_insert_iterator 插入到容器尾
front_insert_iterator 插入到容器头
函数
make_reverse_iterator 创建一个reverse_iterator
make_move_iterator 创建一个move_iterator
front_inserter 创建一个front_insert_iterator
back_inserter 创建一个back_insert_iterator
inserter 创建一个insert_iterator
作为容器的元素必须满足以下三个要素:
该元素可拷贝或移动;该元素可赋值;该元素能够被销毁;
注意c++标准模板库仅支持值语义。
注意vector重分配空间后,对原来vector中的元素的引用,指针,和迭代器将会无效。
注意vector特化了一个vector<bool>
版本,更加节省空间。
deque的内部实现,可能是使用了多个内存块,一些用于前向增长,一些用于逆向增长。
注意list的splice成员函数,是在指定的位置的前面插入元素的。
注意自定义关联容器的排序规则时,需要满足严格弱序化(需要区分小于还是等于), 即:
- 反对称性,若果x < y,那么y < x;
- 传递性,若果x < y且y < z, 那么x < z;
- 反自反性,x < x的比较结果是false;
- 相等的传递性,如果!(a < b) && !(b < a)是true, 且!( b < c) && !(c < b)是true,那么!(a < c) && !(c < a)是true;
函数对象,即在类中重载了operator ()
输入输出流:
istream: 输入流读数据,类模板basic_istream的实例化
ostream: 输出流写数据,类模板basic_ostream的实例化
全局流对象:cin,cout,cerr,clog
流继承关系,如下图
其它的功能,在遇到的时候再参考帮助文档与其他资料学习。
参考
1. 《The C++ Standard Library 2nd edition》,Nicolai M.Josuttis.
2. cppreference
C++ Standard Library相关推荐
- python standard lib_跟Python Standard Library混个脸熟(一)
跟Python Standard Library混个脸熟(一) [TOC] Python 本身提供了很丰富的功能,怎么学习这些东西一直是我思考的,通读整个 Python3 Standard Libra ...
- (轉貼) C Standard Library (初級) (C/C++)
轉貼自 http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html C Standard Library [Last modifi ...
- C++学习书籍推荐《The C++ Standard Library 2nd》下载
百度云及其他网盘下载地址:点我 编辑推荐 经典C++教程十年新版再现,众多C++高手和读者好评如潮 畅销全球.经久不衰的C++ STL鸿篇巨著 C++程序员案头必 备的STL参考手册 全面涵盖C+ ...
- 【概念的辨异】—— ISO C 与 POSIX C(C standard library 与 C POSIX library)
ISO C 表示 C Standard Library,也就是 C 标准库. 二者的主要区别在于: POSIX 是 C 标准库的超集(也即是从内容上,C 标准库是 POSIX 库的一部分,POSIX ...
- Ensure that you have a dependency on the Kotlin standard library
完整log: Kotlin: Cannot access built-in declaration 'kotlin.Array'. Ensure that you have a dependency ...
- C++ Standard Library Style Guidelines
///This articel just is a guideline but not a rule.此文仅为建议,并为规范. This library is written to ...
- Python Standard Library (中文版) 网络协议
目录 1. 网络协议 1.1. 概览 1.1.1. Internet 时间协议 1.1.2. HTTP 协议 1.2. socket 模块 1.2.0.1. Example 7-1. 使用 socke ...
- python标准库书籍_Python标准库中文版 Python Standard Library 329页Python标准库合集
• 0.1. 关于本书 • 0.2. 代码约定 • 0.3. 关于例子 • 0.4. 如何联系我们 1. 核心模块 o 1.1. 介绍 o 1.2. _ _builtin_ _ 模块 o 1.3. e ...
- 《The C++ Standard Library》第50页 关于传递auto_ptr的问题
第50页最后一段话: 我怎么没记得在第43页里说不能传递auto_ptr. 可是我在第43页没有找到"不要用任何方式来传递auto_ptr"类似的语句啊. 而且里面讲的是sourc ...
最新文章
- IOS代码实现常用控件UIButton、UISlider、UISwitch、UISegmentedControl
- gradient boosted regression tree
- 基于AppDomain的插件式开发
- 推荐:CLR 完全介绍-一篇讲解CLR内存回收机制以及常见的调试技巧的文章
- 线性代数:矩阵乘向量的特性学习笔记
- (转)Hibernate的优化方案
- MVC中使用KindEditor
- 产品研发过程管理专题——软件工程(软件目的需求开发与管理)
- mysql连接量设置_mysql连接数设置操作方法(Too many connections)
- 旋转矩阵、旋转向量(轴角)、四元数、欧拉角之间相互转换的代码实现(利用Eigen实现)...
- 平年用c语言的计算方式,C语言平年闰年问题
- Mac使用OpenCV项目步骤
- SpringBoot邮箱注册验证
- ssr提示服务器名无效_免费领取腾讯云服务器附带新手配置步骤(搭建网站)
- 陈春花:创造价值 做好产品
- python数据获取及预处理_Python小练习——电影数据集TMDB预处理
- solidworks显示无法连接到服务器,SOLIDWORKS Electrical解决方法:无法连接协同服务器...
- 数字图像处理篇(7)角点检测
- cxzday8-字符串作业
- 5年老java开发,我看过哪些书,看过哪些视频,刷过哪些面试题,都在这里了
热门文章
- 什么叫做实体经济危机?
- 【转载】软件测试行业趋势分析和思考
- 2021-4-8学习笔记
- vue如何动态渲染本地图片img
- JavaScript:原生JS实现Facebook实时消息抓捕
- Android获取的MP3音乐的专辑封面图片
- 04、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及利用TIM输出比较配置PWM】
- python批量下载网页文件夹_Python抓取网页批量下载文件方法初探(正则表达式+BeautifulSoup) (转)...
- 传奇服务器人物技能怎么修改,如何修改传奇服务器中角色等级相关系统
- SAP中物料报废无法确定账户问题处理实例