- 博客(25)
- 收藏
- 关注
原创 《C++11标准库》5.1.1Pair
class pair 可将两个 value视为一个单元。C++标准库内多处用到了这个 class 。尤其是容器 map、multimap、unordered_map和 unordered_multimap就是使用 pair 来管理其以 key/value pair形式存在的元素。任何函数如果需要返回两个 value,也需要用到 pair,例如 minmax()。pair的结构定义于<utility>,且提供如下所示各种操作:原则上你可以对pair<>执行 creat,copy
2022-05-11 19:23:30 545
原创 《C++11标准库》5.1Pair和Tuple(简介)
C++标准库第一版,C++98提供了一个简单的class,用来处理类型不同的两个(一对)值,而不需要再为它们定义一个特别的 class。当标准函数需要返回 value pair,或者当容器元素是个 key/value pair时,就会用上这样一个 class。TR1引入了一个 tuple class,他将上述概念延伸,接受任意(但仍有限)个元素。标准库实现保证可移植范围是:允许 tuple带有最多10个类型不同的元素。到C++11,tuple class 被重新实现,采用 variadic temp
2022-05-10 15:52:11 299
原创 《C++11标准库》4.6分配器(Allocator)
C++标准库在许多地方采用特殊对象处理内存的分配和归还,这样的对象称为 allocator(分配器)。Allocator 是一种特殊的内存模型,被当成一种——用来把”内存需求“转换为”内存低级调用“的抽象层。如果在相同时间采用多个不同的 allocator 对象,便可以在同一个程序中采用不同的内存模型。最初,allocator 是作为 STL 的一部分而引入,用来处理诸如 PC 上不同的指针类型(例如 near、far、huge指针)。现在则作为”运用某种内存模型“的技术方案的基础,是的诸如共享内存
2022-05-09 19:46:06 491
原创 《C++11标准库》4.5并发与多线程(概述)
在C++11之前,语言本身和C++标准并不支持并发,虽然编译器可以实现并对此提供某种支持。但在C++11中,不论是内核语言还是标准库都加强支持并发编程。以下内容适用于内核语言:*如今具备了这样一个内存模型,保证当你修改“被不同的两个线程使用的”两个不同对象时,它们彼此独立。在C++11之前,并不保证“某一线程涂写一个 char “不会干涉”另一线程涂写另一个char“。*引入一个新关键字 thread_local,用来定义”线程特定“的变量和对象。标准库提供以下特性:*若干线程安全相关的
2022-05-09 19:29:17 296
原创 《C++11标准库》4.3.1标准的 Exception Class(异常类)
所有被语言本身或标准库抛出的异常,都派生自基类 exception ,定义于 <exception> 。它是若干标准异常的基类,它们共同形成一个类体系,如图所示,这些标准异常可被分为三组:1:语言本身支持的异常。2:C++标准库发出的异常。3:程序作用域之外发出的异常。逻辑错误通常可以避免,因为其错误发生在作用域内,例如先决条件被违反。运行期异常则是由一个位于程序作用域之外的原因触发,例如资源不足。针对语言支持而设计的异常类:此类异常用以支撑某些语言特性,所以,从
2022-05-07 15:02:17 1231
原创 《C++11标准库》4.3差错和异常(Error and Exception)的处理
C++标准库由不同成分构成。来源不同,设计与实现的风格迥异。而差错处理和异常处理正是这种差异的典型表现特征。对于标准库中的一部分,例如 string class,支持具体的差错处理,它们检查所有可能发生的差错,并在差错发生时抛出异常。至于其它部分,例如 STL和 valarray,优先考虑执行效率而不是安全,因此几乎不检验逻辑差错,并且只在运行期发生差错时才抛出异常。...
2022-05-06 15:01:31 294
原创 《C++11标准库》4.2头文件( Header File)
在C++标准化过程中,将C++标准库中所有的标识符都定义于 namespace std 内,这样的作法不具备向后兼容性,因为原先的C/C++头文件都将C++标准库的标识符定义于全局范围。标准化过程中有些 class 接口也有了变动。为此,C++standard 特别引入了一套新的头文件命名风格,这么一来组件的供应商便可以通过“提供旧式头文件”来达到向后兼容的目的。既然有必要重新定义定义标准头文件的名称,C++11正好借此机会把头文件的扩展名做一个规范,以往的头文件的扩展五花八门,例如 包括 .h, .h
2022-05-05 19:42:53 935
原创 《C++11标准库》4.1命名空间(Namespace)std
当我们在采用不同的模块或程序库时,经常会出现名称冲突的现象,这是因为不同的模块和程序库可能对不同的对象使用相同的标识符(identifier)。Namespace 正是用来解决这种名称冲突问题的。所谓的 namespace 指标识符的某种可见范围。和 class 不同,namespace 具有扩展开放性,可发生于任何源码文件上。因此,你可以使用一个 namespace 来定义若干组件,而它们可散布于多个实质模块内。这类组建的典型例子就是 C++标准库,在C++标准库内就使用了一个namespace。
2022-05-04 19:38:57 1173
原创 《C++11标准库》3.2.2main()定义式
对于 main() 函数,有一个重要而常被误解的核心语言点:唯一“正确且具有移植性”的 main() 函数。根据C++标准,main() 只有两种定义式具备可移植性,那就是:int main(){ ...... return 0;}和int main( int argc , char* argv[] ){ ...... return 0;}对于第二个样例中的参数 argv ,也就是命令行实参所形成的 array ,其类型也可定义为 char** ,但是要注
2022-05-03 19:15:57 517
原创 《C++11标准库》3.2.1基础类型的明确初始化(Explicit Initialization for Fundamental Type)
如果你使用“一个明确的构造函数调用,但不给实参”这样的语法,基础类型会被设置初值0:例如:int i1 ;//未定义值。int i2 = int() ;//初始化为 0 。int i3{}//初始化为 0 。这个特性使你可以写出“确保无论任何类型,其值都有一个确凿的类型的默认值”的 template code(模板编码)例如下面的函数中,初始化保证了“ x 如果是基础类型,会被初始化为 0 。”:template < typename T >void f(){
2022-05-02 19:29:21 490
原创 《C++11标准库》3.2 Template虽旧犹新的语言特性
Nontype Template Parameter(非类型模板参数)Type parameter(类型参数)之外,我们也可以为 template 使用 nontype parameter(非类型参数)。这样的参数亦被视为 template 类型的一部分。例如对于标准的 class bitset<>,你可以传递bit 个数为实参。例如:bitset< 32 > flags32 ;// 32bits 的 bitsetbitset< 50 > flags50 ;/
2022-05-01 18:22:31 267
原创 《C++11标准库》3.1.14新的基础类型(New Fundamental Data Type)
对于以下的新式基础数据类型,定义于 C++11;* char16_t 和 char32_t:char16_t :一个char16_t只能保存2字节,所以只能用0000~ffff范围内的字符对其进行初始化或赋值,使用比0000 ffff大的编码,直接报错。二进制打印出char16_t的值,严格等于utf16编码,在这个范围内,也就是严格等于unicode编码。char32_t:一个char32_t四个字节,可以保存所有的unicode字符。但是要注意初始化时,字符常量前要用U.* long l
2022-04-30 11:55:39 159
原创 《C++11标准库》3.1.13带领域的(Scoped)Enumeration (enum class)
C++11允许我们定义 scoped enumeration(作用域的枚举)--又称为 strong enumeration 或 enumeration class。这是C++ enumeration value(或 enumerator(枚举符))的一个比较干净的实现。其声明格式为:enum class 枚举名:类型 //若没有声明类型,则默认为 int{ 枚举元素表列;}例如:enum class Salutation : char { mr , ms , co , non
2022-04-29 20:25:11 875
原创 《C++11标准库》3.1.12新的函数声明语法
在某些时候,函数的返回类型取决于某个表达式对实参的处理。然而对于类似如下代码:template <typename T1, typename T2>decltype( x + y ) add( T1 x, T2 y);这样的定义在C++11之前是不能实现的,因为返回式所使用的对象未被引用,或未在作用域内。但是在C++11中,你可以将一个函数的返回类型声明在参数之后:template <typename T1, typename T2>add( T1 x, T2
2022-04-28 19:00:42 566
原创 《C++11标准库》3.1.11关键字decltype
decltype 是C++11新增的一个关键字,用于使编译器在编译期找出表达式的类型,这其实就是常被要求的typeof 的特性的体现,但由于原有的 typeof 缺乏一致性又不完全,所以才引用这个关键字。其格式为:decltype(exp) temp = value ;其中 exp可为变量,函数或一个表达式,作为 temp 的类型。当 exp 为一个变量,则返回该变量的类型(包括顶层的 const 和引用)当 exp 为一个函数时,编译器并不会实际调用函数,而是当调用发生时使函数的返回
2022-04-27 20:43:49 564
原创 《C++11标准库》3.1.10 Lambda,Capture
C++11引入了 lambda,允许 inline 函数的定义式被用作为一个参数,或是一个 local 对象。Lambda 改变了C++标准库的用法。比如使用 lambda搭配 STL算法和容器,使用 lambda 定义并发代码。Lambda 的语法所谓的 lambda 是一份功能定义式,可被定义于语句或者表达式内部。因此,你可以拿 lambda当作 inline 函数使用。最小型的 lambda 函数没有参数,什么也不做,例如:[] { std::cout <<
2022-04-26 18:06:54 802
原创 《C++11标准库》3.1.9崭新的 Template 特性与Alias Template
自C++11起,template 可以拥有那种“得以接受个数不定之 template 实参”的参数。此能力称为 variadic template (可变参数宏)。例如,对于print()函数,得以在调用它时给予不定个数的实参且各具不同类型:void print(){ std::cout << "执行无参print()" << std::endl;}template<typename T,typename... Types>void print(c..
2022-04-24 21:00:22 489
原创 《C++11标准库》3.1.8关键字constexpr与const
自 C++11起,constexpr 可用来让表达式核定于编译期。例如:constexpr int square (int x){ return x*x;}float a[square(9)];//此数组大小为81这个关键字修正了在C++98中使用数值极限时出现的问题,在C++11之前,如下代码:std::numeric_limits<short>::max()无法被用作一个常量,虽然他在功能上等同于宏 INT_MAX。如今,在C++11中,这样的一个式子被声
2022-04-23 19:47:25 404
原创 《C++11标准库》3.1.7关键字 noexcept
C++11提供了关键字 noexcept,用来指明某个函数无法—或不打算抛出异常。例如:void foo() noexcept;声明了 foo() 不打算抛出异常。若有异常未在 foo() 内被调用—亦即如果 foo() 抛出异常,程序会被终止,然后 std::terminate() 被调用并默认调用 std::abort() 。noexcept 瞄准了空异常明细所显示的许多问题。运行期检验:C++异常明细仍是被检验于运行期而非编译期,所以它无法对程序员保证每个异常都被处理。
2022-04-22 23:12:46 596
原创 《C++11标准库》3.1.6新式的字符串字面常量 Raw string(String Literal)
字符串字面常量(String Literal)
2022-04-21 21:33:58 1530
原创 《C++11标准库》3.1.5 Move语义和Rvalue Reference(右值引用)及Rvalue,Lvalue Reference(左值引用)的重载规则和返回Rvalue Reference
C++的一个最重要的特性之一就是支持 move semantic(搬迁语义/移动语义),这项语义更加贴合C++的主要设计目标:用以避免非必要拷贝(copy)和临时对象(temporary)。首先,我们要知道为什么需要move语义,对于以下代码:对于上述代码,我们将新对象插入集合中,后者提供一个成员函数可为传入的元素建立一份内部拷贝(internal copy) ,set.insert()简化模板可为:这样的建立拷贝的方式是有用的,因为对于创建的对象x在被插入集合后,这个对象仍有可能被使用
2022-04-20 23:29:25 716
原创 《C++11标准库》3.1.4Range-Based for循环
C++11引入了一种崭新的for循环形式,可以逐一迭代某个给定的区间,数组,集合内的每一个元素。其他语言可能称此为foreach循环。其一般性语法如下:coll:存储数据的集合。decl:coll集合中每个数据元素的声明。statement:针对decl声明的元素所要执行的指令。例如:此特性也可用于容器。例如:将vector容器中每个元素乘以3.在上述例子中,将elem声明为一个引用(reference),以修改原数据且提高效率,如若不这样做,for循环将会作用在元.
2022-04-19 21:34:23 700
原创 《C++11标准库》3.1.3一致性初始化(Uniform Initialization),窄化问题与初值列(Initializer List)与explicit。
在C++11之前,会有一个问题:如何初始化一个变量或对象。初始化可因为小括号,大括号或赋值操作符(assignment operator)的出现而发生。为此,c++11引入了“一致性初始化”(uniform initialization)概念。意思是,对于任何初始化动作,你可以使用相同的语法,也就是大括号。例如:初值列会强迫造成所谓的 value initialization (列表初始化|广义缺省初始化),意思是即使某个local(本地)变量属于某种基本类型(那通常会有不明确的初值)也会被初始
2022-04-19 00:29:35 489
原创 《C++11标准库》3.1.2以auto完成类型推导
C++11允许声明一个变量或对象(object)而不需要指明其类型,只需说它是auto。以auto声明的变量,其类型会根据其初值被自动推断出来,因此在使用auto时,一定需要一个初始化操作。auto自动推导类型,在类型很长或者表达式很复杂是时,非常有用。例如:auto的自动推导发生在编译器,使用auto对于程序不会造成程序效率降低问题。auto不能被声明为返回值,auto不能作为形参,auto不能被修饰为模板参数。auto在const与&中的使用1.如果初始化表达
2022-04-17 22:36:30 481
原创 《C++11标准库》3.1.1Template表达式与nullptr
”在两个template表达式的闭符之间存放一个空格“的要求以经过时。即在两个template同时使用时,可以<<>>直接使用,而不用加入空格分隔。nullptr与std::nullptr_tC++相比于C,对于指针的隐式转换要求更为严格,不能将void*类型隐式转换为其他指针类型,即(void*)0不能对其他类型指针赋初值,不能起到空指针的作用。而对于定义NULL的值为0来定义空指针,在一些情况中会引起混淆,特别是函数重载中。在C++11的新特性中,使用nu
2022-04-16 23:49:51 382
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人