C++ Standard Library

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);
  1. c++11支持作用域枚举
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<tyname 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

转载于:https://www.cnblogs.com/corfox/p/5422696.html

C++ Standard Library Quick Reference by Peter Van Weert, Marc Gregoire 2016 | ISBN: 1484218752 | English | 206 pages PDF+EPUB This quick reference is a condensed reference guide to the essential data structures, algorithms, and functions provided by the C++ Standard Library. More specifically, this is a compact collection of essential classes and functions, used by C++ programmers on a daily basis. The C++ Standard Library Quick Reference features core classes for strings, I/O streams, and various generic containers, as well as a comprehensive set of algorithms to manipulate them. In recent years, the C++11 and C++14 standards have added even more efficient container classes, a new powerful regular expression library, and a portable multithreading library featuring threads, mutexes, condition variables, and atomic variables. Needless to say, it is hard to know and remember all the possibilities, details, and intricacies of this vast and growing library. This handy reference guide is therefore indispensable to any C++ programmer. It offers a condensed, well-structured summary of all essential aspects of the C++ Standard Library, including all aforementioned functionality. No page-long, repetitive examples or obscure, rarely used features. Instead, everything you need to know and watch out for in practice is outlined in a compact, to-the-point style, interspersed with well-chosen, clarifying examples. The book does not explain the C++ language or syntax, but is accessible to anyone with basic C++ knowledge. Even the most experienced C++ programmer though will learn a thing or two from it and find it a useful memory-aid. What You Will Learn • The essentials that the C++ Standard Library has to offer • How to use containers to efficiently store and retrieve your data • How to use algorithms to inspect and manipulate your data • How lambda expressions allow for elegant use of algorithms • What the standard string class provides and how to use it • What functionality the library provides for file and stream-based I/O • What smart pointers are and how to use them to prevent memory leaks • How to write safe and efficient multi-threaded code using the C++11 threading libraries
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值