首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【笔记】《C++Primer》—— 第四部分:高级主题(完)

std命名空间中regex_constants命名空间中使用 17.3有一些正则表达式语法 C++我们应该使用随机数库来生成更好随机数,随机数库包含了生成随机unsigned整数序列随机数引擎和利用引擎生成符合特定分布随机数随机数分布器...每个命名空间都是一个作用域,一个命名空间由关键字namespace和命名空间名字开始,然后用一个括号括住需要需要放置名字,和不同命名空间括号外不需要分号结尾 命名空间可以分布式定义,也就是可以被定义在不同文件...当我们调用new时候,size_t参数是要分配对象字节数,当我们调用new[]时,参数则是数组所有元素字节和。...自定义new时,void *operator new(size_t, void*);函数不能被重新定义,这是标准库专用 没有使用定位new时,默认会调用void *operator new(size_t...直观理解就是当我们用解引用符*对成员指针解引用时,我们得到是对应成员类型,我们还需要对应某个具体对象用点或箭头获取对象这个成员类型真正值 我们调用成员函数方法和使用成员差不多,区别是标志着函数名括号仍然不可少

85410

Python学习笔记(四)—列表(list)、元组(tuple)和字典(dictionary)、集合(set)

list创建  创建一个list,只要把逗号分隔不同数据使用方括号括起来即可。...而且tuple使用小括号list使用方括号。  tuple创建  tuple创建很简单,只需要在括号添加元素,并使用逗号隔开即可。...= () 创建只有一个元素tuple,需要在元素后面添加逗号,否则括号会被  当作运算符使用,我们可以通过 type()函数来查看类型: >>> t1 = (1) >>> type(t1) <class...set)  1、dict(字典)  字典是另一种可变容器模型,且存储任意类型对象。...  set和dict唯一区别仅在于没有存储对应value,但是,set原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。

1.4K00
您找到你想要的搜索结果了吗?
是的
没有找到

C++11常用新特性快速一览

// 强行实例化 extern template class std::vector; // 不在该编译文件实例化模板 尖括号 “>” 在传统 C++ 编译器,>> 一律被当做右移运算符来进行处理...auto new_tuple = std::tuple_cat(get_student(1), std::move(t)); 9. 正则表达式 正则表达式描述了一种字符串匹配模式。...如果是 a=b,这样就会调用复制构造函数来初始化 that(因为 b 是左值),赋值操作符会与新创建对象交换数据,深度拷贝。...如果是 a = x + y,这样就会调用转移构造函数来初始化 that(因为 x+y 是右值),所以这里没有深度拷贝,只有高效数据转移。...C++ 11std::auto_ptr 已经被 std::unique_ptr 所取代,后者就是利用右值引用。

2.5K50

深入解析C++auto自动类型推导

于是C++标准委员会在C++11标准改变了auto关键字语义,使它变成一个类型占位符,允许在定义变量时不必明确写出确切类型,让编译器在编译期间根据初始值自动推导出它类型。...类型,这时无论括号内是单个元素还是多个元素,都是推导为initializer_list类型,而且如果是多个元素,每个元素类型都必须要相同,否则将编译错误,如下例子: auto x1 =...>,这里将经过两次类型推导,第一次是将x1推导为initializer_list类型,第二次利用括号元素推导出元素类型T为int类型。...结构化绑定功能(C++17) C++17标准auto还支持了结构化绑定功能,这个功能有点类似tuple类型tie函数,它可以分解结构化类型数据,把多个变量绑定到结构化对象内部对象上,在没有支持这个功能之前...内初始化成员时不能使用auto 在C++11标准已经支持了在内初始化数据成员,也就是说在定义时,可以直接在内声明数据成员地方直接写上它们初始值,但是在这个情况下不能使用auto来声明非静态数据成员

12620

C++20新特性个人总结

这个特性在GCC、MSVC编译器早已实现,但在其他编译器以前版本并未实现。  我理解是,在模板内,可以忽略访问权限而访问到其他嵌套。 ...(满足任意一个):  ①字面量  ②是一个lvalue  ③包含占位符类型  ④派生类型一个占位符  ⑤拥有强结构可比较性,没有mutable或者volatile修饰对象,拥有声明为public...,则对象必须通过其中一个构造函数进行初始化。 ...②throw表达式一个隐式移动实体id-expression,其范围不超出最内层try块  或  [复合语句或构造函数初始值包含该throw表达式函数try块(如果有)] 复合语句。 ...指向成员指针类型,且引用相同成员,或者都是空成员指针值;  ⑦引用类型,且引用相同对象或函数;  ⑧数组类型,对应元素满足模板参数等效;  ⑨共用体类型,或者都没有活动成员,或者都具有相同活动成员

1.8K50

真没想到nullptr和NULL得区别,大了去了

第3章 转向现代C++ 条款7:在创建对象时注意区分()和{} //创建对象时候注意区分 () 和 {} //指定初始化方式有:小括号,等号,大括号 //情况1:内建型别来说 int 初始化和赋值没有区别.../不可行 //结论:可见 {} 初始化方式比较统一,但是注意它有一新特性: //禁止内建型别之间进行隐式型别转换,如果大括号表达式无法保证能够采用进行初始化对象来表达,则代码不能通过编译 double...,所有使用大括号来完成对象默认构造没有问题 //大括号解决第三问题:构造函数形参 具备 std::initializer_list型别 //1, 如果没有以上型别,() 和 {} 没有区别 class...// 在构造函数重载决议期间,只要有任何可能,大括号初始化物就会与带有std: : initializer_ list 型别的形参相匹配,即使其他重载版本有着貌似更 加匹配形参表 。...//引用C++11 std::tuple型别的各个阈时,假设为一个社交网站准备一个元组来持有名字,电子邮件和声望值 using UserInfo = std::tuple<std::string,

1.7K30

C++八门初始化规则

编译器会把等号右侧初始值拷贝到新创建对象中去,不使用等号则执行是直接初始化 传统C++列表初始化仅能用于普通数组和POD类型,C++11新标准将列表初始化应用于所有对象初始化(但是内置类型习惯于用等号初始化...类型默认初始化 定义一个变量但是没有指定初始值时,会使用默认构造函数来初始化,所以没有默认构造函数不能执行默认初始化。...C++98/03与C++11列表初始化 在C++98/03,普通数组和POD(Plain Old Data,即没有构造、析构和虚函数或结构体)类型可以使用括号{}进行初始化,即列表初始化。...总的来说,圆括号是通过调用vector构造函数进行初始化,如果使用了括号那么初始化过程会尽可能会把括号值当做元素初始值列表来处理。...Tips: 对象在被列表初始化时会优先调用列表初始化构造函数,如果没有列表初始化构造函数则会根据提供括号调用匹配构造函数 C++11新标准提供了两种方法用于处理可变数量形参, 第一种是我们这里提到

2.4K10

第 17 章 标准库特殊设施

不过使用这两个,必须知道 tuple对象类型,这可以通过 decltype很简单地得到。...typedef decltype(item) trans; // 返回 trans类型对象成员数量 size_t sz = tuple_size::value; // 返回 3 //...如果正则表达式模式包含一个或多个子表达式时,得到 smatch对象还会包含多个 ssmatch对象,表示与模式每个子表达式匹配信息。 对于多个子表达式,使用括号来进行分组隔开。...得到匹配对象,第一个子匹配位置为 0,表示整个模式对应匹配,随后是每个子表达式对应匹配。...C++解决上述问题方法是,使用随机数发生器,包括一个随机数引擎(生成 unsigned随机数序列)和分布对象(使用引擎返回服从特定概率分布随机数)。

1.1K30

【笔记】C++标准库: 体系结构与内核分析(下)

在STL算法传入操作除了原生函数外, 我们可以传入所谓仿函数(Functor; 函数对象), 也就是一个行为上类似函数, 这种类都重载了自己调用运算符operator()....所谓适配是如下图两个只有typedef而没有成员结构体. 我们自己仿函数在构造时候就需要从模板给出继承接口问题答案, 这样适配器才能正确处理....在这里有个小称呼, 没有继承适配接口仿函数我们称其"没有融入STL", 这是因为只有继承了适配接口才能完整地与STL协同使用....stdhash仿函数来对基本类型进行散列 // 其它部分就是一些打乱操作, 没什么特别的原理, 下面的魔数是黄金分割数 seed^=std::hash()(val) + 0x9e3779b9...t); int i = get(t); float f = get(t); // 对某一赋值, 注意类型问题 get(t) = get(t); // tuple比较, 整体赋值之类自然也是可以

77120

《Effective Modren C++》 进阶学习(上)

调用拷贝函数 从上述看,在C++这三种方式都被指派为初始化表达式,但是只有括号任何地方都能被使用。因此括号初始化又叫统一初始化。...w8{std::move(w4)}; // 使用括号调用std::initializer_list构造函数 接着上述,在使用{}初始化时,只要参数能强转换为initializer_list...要求变窄转换 只有当传入参数在编译器上无法转换成std::initializer_listT类型,才会匹配普通构造函数。...在构造重载匹配,只要参数能够强转std::initializer_listT,就会匹配std::initializer_list构造函数,即便有更加匹配构造函数。...可以规避在声明子类接口时没有和基保持一致,又难以察觉,导致子类接口在运行没有调用到这种低级问题。 13.

16520

《C++Primer》第十七章 标准库特殊设施

vn);:每个成员用对应初始值vi进行初始化,此构造函数是explicit make_tuple(v1, v2, ..., vn):返回一个用给定初始值初始化tupletuple类型从初始值类型推断...返回t第i个数据成员引用,如果t是一个左值则返回左值引用,否则返回一个右值引用 tuple_size::value:一个模板,可以通过tuple类型来初始化,表示给定tuple...>, int, list> someVal("constants", {3.14, 2.718}, 42, {0,1,2,3,4,5}) // 提供初始值 // 注意tuple...sregex_interator:迭代器适配器,调用regex_search来遍历一个string中所有匹配子串 smatch:容器,保存在string搜索结果 ssub_match:string...下面的代码读取一个文件,用此模式查找与完成电话号码匹配数据,然后调用一个valid数来检查号码格式是否合法: string phone = "(\\()?(\\d{3})(\\))?

73030

Chapter 3: Moving to Modern C++

ok int sum3 = x+y+z; // ok 调用对象无参构造函数时,使用括号初始化会被编译器错误识别为声明了一个函数,而括号初始化则能正确匹配到无参构造函数调用 Widget w1(...::initializer_list参数,在使用括号初始化时,编译器会强烈地偏向于调用使用std::initializer_list参数重载构造函数 class Widget { public...只有当没有办法在括号初始化参数类型和std::initializer_list参数类型之间进行转换时,编译器才会重新选择正常构造函数 class Widget { public:...::initializer_list构造函数时,此时调用括号初始化,编译器会解析为调用默认构造函数,而要解析成std::initializer_list构造函数,需要在括号嵌套一个空括号进行初始化...Prefer nullptr to 0 and NULL C++会在需要指针地方把0解释成指针,但是需要策略还是把0解释成int型 C++98上面这种做法会使得在指针和int型重载共存时产生意外匹配调用

1.8K60

Python复习 一

'> 没错,没有括号列表数据也是tuple元组。...') 'XIAOMI-HUAWEI=CHINA' 从代码可以看出,字符串括号内容是对应这format方法参数值索引内容,通俗说:括号索引会将format对应参数值调用组成一个字符串...函数含义就是将需要且重复功能代码封装在一个对象函数,需要使用时候直接调用即可。...异常 Exception: 所有异常(可以接收任何异常) AssertionError:assert语句失败(assert条件不成立) AttributeError:访问一个对象没有的属性(对象属性不存在...+和Java方法; 在Python中表示私有的属性:变量名前两个下划线“__” 继承 class 名(被继承): self:只可以使用自己对象 super:可以从子类调用属性对象

1.2K20

【笔记】《C++Primer》—— 第17章:标准库特殊设施

17.1 tuple类型 tuple是类似pair类型,可以简单地保存类型不同数量任意对象,定义在头文件tuple tuple最重要用处就是用来当作一个简单快速数据结构 我们需要用tuple...,会推断参数类型并生成tuple返回 我们可以用get函数来取得tuple元素,get模板参数get是目标元素在tuple序号,从0开始 如果不知道一个tuple具体信息的话,可以用tuple_size...ssub_match 所谓子匹配式,在正则表达式中有一个叫子表达式部分,通常在匹配模式括号()括起来,子表达式会在匹配时被存入子匹配,即每个match中都存有n+1个sub_match,其中位置...作为改进,在C++我们应该使用随机数库来生成更好随机数 随机数库包含了生成随机unsigned整数序列随机数引擎和利用引擎生成符合特定分布随机数随机数分布器 随机数引擎是函数对象,重载了一个不需要参数调用运算符...,我们可以调用这个来生成一个unsigned原始随机数。

99720

泛型

之后在使用泛型或泛型方法代码,需要在类型名或方法名后同样用尖括号包围,给出具体实参类型。图2-2以List为例呈现了二者关系。...元组系列包含了一个非泛型静态Tuple以及一批泛型TupleTupleTuple等。...如果在List对象调用GetType()方法,那么得到结果 将包含int这个类型实参信息。...接下来讨论typeof(T)。该表达式返回调用代码T类型实参Type。它返回值永远是一个封闭、已构造类型,技术规范中将其描述为一个真正不包含任何类型形参类型。...泛型是C# 2截至目前最庞大一个特性了,也是对C# 1重大改进。下面介绍空值类型,此项特性正是基于泛型建立

1.3K10

【笔记】C++2.0新特性

也可用模板函数get(t)来直接取得tuple元素, 这里index是所需序号, t是目标tuple 在Variadic Templates还没有的时候, tuple是由大量嵌套define...版本构造函数, 然后分为以下情况: 目标对象有定义initializer_list版本函数, 调用 目标对象没有定义initializer_list版本函数, 查看当前initializer_list...与现有的普通函数是否匹配, 如果匹配(也就是和()一致时)则调用, 否则编译失败 两个版本函数同时存在, 优先调用initializer_list版本函数 当使用()进行调用时, 则只能使用普通版本函数调用...当在构造函数中使用, 代替()但没有指明参数时, 会进行默认构造, 即使是基本类型也会被默认构造为0 initializer_list本质是一个数组, 其成员是指向数组迭代器和记录initializer_list...当异常在noexcept抛出时会调用std::terminate() override用于虚函数, 在派生写出, 标明了派生类目前是要覆写基同名虚函数, 当派生没有这个接口覆写时候会编译失败

86320

第 17 章 标准库特殊设施

不过使用这两个,必须知道 tuple对象类型,这可以通过 decltype很简单地得到。...typedef decltype(item) trans; // 返回 trans类型对象成员数量 size_t sz = tuple_size::value; // 返回 3 //...如果正则表达式模式包含一个或多个子表达式时,得到 smatch对象还会包含多个 ssmatch对象,表示与模式每个子表达式匹配信息。 对于多个子表达式,使用括号来进行分组隔开。...得到匹配对象,第一个子匹配位置为 0,表示整个模式对应匹配,随后是每个子表达式对应匹配。...C++解决上述问题方法是,使用随机数发生器,包括一个随机数引擎(生成 unsigned随机数序列)和分布对象(使用引擎返回服从特定概率分布随机数)。

71820

C++(STL):01---pair容器

构造函数,将rv内容移至p(允许隐式类型转 换) p=p2将p2赋值给p(始自C++11;允许隐式类型转换)P=rv将rv值moveassign给p(始自C++11;允许隐式 型转换)p.first...和val2类型和数值 三、构造函数、赋值、移动语义 规则: ①定义pair时,不给出值时,使用默认构造函数初始化 ②使用圆括号/括号初始化器进行初始化 默认构造函数 规则:默认构造函数生成一个pair...是个member template,在“构造过程需要隐式类型转换”时被调用。...如果pair对象被复制,调用是这个版本 演示案例: void f(std::pair); void g(std::pair<const int, std::string...其他运算符原理类似 九、 pair运用实例 C++标准库大量使用pair: 例如(unordered)map和multimap容器元素类型都是pair,也就是一对key/vaule C++标准库凡“

57220

第6章 | 表达式 | 优先级,块与分号,生命,if match

块表达式值是最后一个表达式 ip.to_string() 值。 请注意,ip.to_string() 方法调用后面没有分号。...大多数 Rust 代码行以分号或括号结尾,就像 C 或 Java 一样。如果一个块看起来很像 C 代码,在你熟悉每个地方都有分号,那么它就会像 C 块一样运行,并且其值为 ()。...与 C 不同,条件周围不需要圆括号。事实上,如果出现了不必要括号,那么 rustc 会给出警告。但括号是必需。 else if 块以及最后 else 是可选。...这样一来,其他模式将永远没机会匹配到(编译器会发出警告)。 编译器可以使用跳转表来优化这种 match,就像 C++ switch 语句一样。...当 match 每个分支都生成一个常量值时,也会应用与 C++ 类似的优化。在这种情况下,编译器会构建出这些值数组,并将各个 match 编译为数组访问。

6910
领券