C++ Standard Library

*注:内容主要是对參考1的学习记录。知识点与图片大都来源于该书,

部分知识点与图片来源于參考2。

详细參考信息,见最下方參考

*

C++98中新支持的语言特性

  1. 非类型模板參数template<std::size_t N> class bitset;
  2. 模板类中的默认模板參数template<typename T, typename Allocator = std::allocator<T>> calss vector
  3. 关键字typename用来表示随后的标识符是一个类型。
  4. 支持类的成员函数是成员模板函数,然而该成员函数不能是虚函数。
  5. 支持嵌套类模板。
  6. 基本类型的显示初始化int x = int();,该特性能够确保模板代码中随意类型的值都有一个初始化的默认值。

C++11中新支持的语言特性

  1. 模板尖括号之间不再须要空格符了。vector<list<int>> // since c++11
  2. 关键字nullptr // since c++11
  3. 关键字auto // since c++11,自己主动类型推导,从变量的初始化器中推导出该变量的类型。
  4. c++11支持统一的初始化形式,使用大括号。注意的是,{}初始化不能进行类型缩小转换。

    比如int x{2.0}; // is wrong

  5. c++11支持初始化列表,如int std::vector<int> v{2, 3, 4, 65}; // initializer list。注意,假设一个类声明了

    显示构造函数。则不可使用初始化列表。
  6. c++11支持foreach循环。

  7. 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 };
}
  1. 返回一个非静态的局部对象的右值引用时错误的。
  2. 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字符串字面值
  1. c++提供关键帧noexcept,指定一个函数不会抛出异常或不准备抛出异常,有异常必须在函数中处理完。c++异常规范是在

    执行时检查。而不是在编译时检查异常。

    执行时检查异常须要编译器产生额外的代码。从而可能会妨碍编译器优化。在泛型代码中。

    非常难知道对模板參数的操作会产生什么样的异常。

  2. 关键字constexpr使表达式能过在编译期被计算出来。

  3. c++11支持可变參数模板。

template<typename T, typename... Types>
void Test(T& x, Types& ... args) {
...
}

在变參模板内。使用sizeof…(args)。会返回參数的数目。

  1. c++11使用模板的别名
template<typename T>
using Vec = std::vector<T>;
Vec<int> vec;
// 等价于
std::vector<int> vec;
  1. c++11函数模板支持默认模板參数;c++11支持局部类型作为模板參数;c++11支持内部链接的函数

    作为非类型模板的函数指针或函数引用。

  2. c++11支持Lambda表达式。

    [capture-list] (params) mutable exception attribute -> ret {body}

    capture-list: 逗号切割的捕获列表。[a, &b]a以值的形式被捕获,b以引用的形式被捕获。[this]以值的形式

    捕获this指针;[&]以引用的形式捕获全部的自己主动变量;[=]以值的形式捕获全部的自己主动变量;[]不捕获不论什么值。

  3. 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, ...};
  1. 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_ulongstd::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的更多相关文章

  1. Python语言中对于json数据的编解码——Usage of json a Python standard library

    一.概述 1.1 关于JSON数据格式 JSON (JavaScript Object Notation), specified by RFC 7159 (which obsoletes RFC 46 ...

  2. C++11新特性——The C++ standard library, 2nd Edition 笔记(一)

    前言 这是我阅读<The C++ standard library, 2nd Edition>所做读书笔记的第一篇.这个系列基本上会以一章一篇的节奏来写,少数以C++03为主的章节会和其它 ...

  3. Python Standard Library

    Python Standard Library "We'd like to pretend that 'Fredrik' is a role, but even hundreds of vo ...

  4. Macro definition of snprintf conflicts with Standard Library function declaration

    Macro definition of snprintf conflicts with Standard Library function declaration 即将此处的宏定义注释掉,因为在VS2 ...

  5. [译]The Python Tutorial#11. Brief Tour of the Standard Library — Part II

    [译]The Python Tutorial#Brief Tour of the Standard Library - Part II 第二部分介绍更多满足专业编程需求的高级模块,这些模块在小型脚本中 ...

  6. [译]The Python Tutorial#10. Brief Tour of the Standard Library

    [译]The Python Tutorial#Brief Tour of the Standard Library 10.1 Operating System Interface os模块为与操作系统 ...

  7. 【概念的辨异】—— ISO C 与 POSIX C(C standard library 与 C POSIX library)

    ISO C 表示 C Standard Library,也就是 C 标准库. 二者的主要区别在于: POSIX 是 C 标准库的超集(也即是从内容上,C 标准库是 POSIX 库的一部分,POSIX ...

  8. Swift Standard Library Reference.pdf

    Swift Standard Library Reference.pdf 下载地址 http://download.csdn.net/detail/swifttrain/7446331 自己的Mark ...

  9. c++学习书籍推荐《Beyond the C++ Standard Library》下载

    百度云及其他网盘下载地址:点我 作者简介 Björn Karlsson works as a Senior Software Engineer at ReadSoft, where he spends ...

随机推荐

  1. Curl操作Elasticsearch的常用方法

    Elasticsearch对于文档操作,提供了以下几种API,本文就说明如何使用curl方式来调用这些API. API种类 单文档操作API 1.* Index API 索引文档 * 为文档创建索引 ...

  2. jcseg-1.8.7版本发布 - 多配置适应+完整开发帮助文档

    jcseg是使用java开发的一款开源中文分词器, 并且提供了最新版本的lucene和solr分词接口. jcseg 1.8.7版本发布了: 1. 更改了内部设计, 加入JcsegTaskConfig ...

  3. Intellij IDEA打开就闪退或关闭

    找到idea安装目录的bin目录,搜索vmoptions可以看到两个文件, idea.exe.vmoptions idea64.exe.vmoptions 1 这两个文件就是IDEA的一些配置文件,带 ...

  4. SQLServer中merge函数用法详解

    http://www.jb51.net/article/75302.htm Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Del ...

  5. Sql server 备份还原后出现“受限制用户”问题

    SQL数据库作备份和还原操作几乎是日常性事务了.但某次在对Sql Server 2005 数据库做备份还原后经常出现数据库“受限制用户”的问题 工具/原料 Windows OS SQL DB 步骤/方 ...

  6. QT TCP网络编程

    首先介绍一下TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.相比而言UDP,就是开放式.无连接.不可靠的传输层 ...

  7. linux 查看机器内存方法 (free命令)

    工作中遇到了统计机器内存的问题.记录一下. free命令可以查看那机器内存. 如下图单位是M 查看man free可以知道,也可以直接从/proc/meminfo文件中读取.

  8. [leetcode]Remove Duplicates from Sorted List II @ Python

    原题地址:https://oj.leetcode.com/problems/remove-duplicates-from-sorted-list-ii/ 题意: Given a sorted link ...

  9. MySQL 高可用性—keepalived+mysql双主(有详细步骤和全部配置项解释)

    博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 前言:生产环境中一台mysql主机存在单 ...

  10. 【转载】.NET/C#-uploadify视频文件or大文件上传

    引言 之前使用Uploadify做了一个上传图片并预览的功能,今天在项目中,要使用该插件上传大文件.之前弄过上传图片的demo,就使用该demo进行测试.可以查看我的这篇文章: [Asp.net]Up ...