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

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

(p2)Copy构造函数,建立p成为p2的拷贝pairp(n)Move构造函数,将rv的内容移至p(允许隐式类型转 换) p=p2将p2赋值给p(始自C++11;允许隐式类型转换)P=rv...和val2的类型和数值 三、构造函数、赋值、移动语义 规则: ①定义pair时,不给出值时,使用默认构造函数初始化 ②使用圆括号/花括号初始化器进行初始化 默认构造函数 规则:默认构造函数生成一个pair...这种特殊的初始化发生在当我们需要安放(emplace())一个新元素到(unordered)map或multimap中时 拷贝构造函数 拷贝构造函数有3个版本: 版本1:接收相同类型的pair 版本2:...pair中某个元素其只有一个nonconstant copy构造函数,那么将不再编译成功。...例如: std::string s, t;//使用s和t初始化一个pair,s和t使用移动语义,表示之后不再使用auto p = std::make_pair(std::move(s), std::move

1.9K20

【翻译】C++17的新特性简介

新特性一览 语言新特性 类模板的模板参数推断 用auto来声明非类型的模板参数 折叠表达式 auto对花括号初始化的新推断规则 Lambda的常量表达式形式 Lambda可以值捕获this了 内联变量...(New rules for auto deduction from braced-init-list) 当使用统一初始化运算符(花括号)时auto的推断发生了一些变化。...,就是现在允许了当expr是一个类似tuple的对象时可以用auto [ x, y, z ] = expr;来初始化,对象中的元素会被绑定到x,y和z上 类似tuple的对象包括std::tuple,...std::pair, std::array和其他一些聚合结构 using Coordinate = std::pair; Coordinate origin() { return...char x = u8'x'; 枚举的直接列表初始化(Direct list initialization of enums) 枚举现在可以用花括号直接初始化了 enum byte : unsigned

3.1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++11新特性 右值引用与新的类功能

    统一的列表初始化 2.1 {}初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。...pair对象 v = { 10,20,30 };// 使用大括号对容器赋值 return 0; } 让模拟实现的vector也支持{}初始化和赋值 namespace my { template...C++11中,std::move()函数位于 头文件中,该函数名字具有迷惑性,它并不搬移任何东西,唯一的功能就是将一个左值强制转化为右值引用,然后实现移动语义。...// 以下代码在vs2013中不能体现,在vs2019下才能演示体现上面的特性。...::move(s1); Person s4; s4 = std::move(s2); return 0; } 类成员变量初始化 C++11允许在类定义时给成员变量初始缺省值,默认生成构造函数会使用这些缺省值初始化

    10210

    Chapter 3: Moving to Modern C++

    Distinguish between () and {} when creating objects C++11中,初始化值的指定方式有三种:括号初始化,等号初始化和花括号初始化;其中花括号初始化是为了解决...等号初始化和花括号初始化可以用于非静态成员变量的初始化 class Widget { ......private: int x {0}; // ok int y = 0; // ok int z(0); // error }; 括号初始化和花括号初始化可以用于不可拷贝对象的初始化...ok int sum3 = x+y+z; // ok 调用对象的无参构造函数时,使用括号初始化会被编译器错误识别为声明了一个函数,而花括号初始化则能正确匹配到无参构造函数的调用 Widget w1(...::initializer_list构造函数时,此时调用空的花括号初始化,编译器会解析为调用默认构造函数,而要解析成std::initializer_list构造函数,需要在花括号中嵌套一个空的花括号进行初始化

    1.8K60

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

    ,int>& p : m) { ... } std::unordered_map 的key是一个常量,所以std::pair的类型不是std::pairstd::string,int>而是 std:...调用的拷贝函数 从上述看,在C++中这三种方式都被指派为初始化表达式,但是只有花括号任何地方都能被使用。因此花括号初始化又叫统一初始化。...Widget w6{w4}; // 使用花括号,调用std::initializer_list构造函数 Widget w7(std::move(w4)); // 使用小括号,调用移动构造函数 Widget...w8{std::move(w4)}; // 使用花括号,调用std::initializer_list构造函数 接着上述,在使用{}初始化时,只要参数能强转换为initializer_list...对于数值类型的std::vector来说使用花括号初始化和小括号初始化会造成巨大的不同。

    20320

    【C++航海王:追寻罗杰的编程之路】C++11(三)

    #define _CRT_SECURE_NO_WARNINGS 1 #include using namespace std; // 以下代码在vs2019下才能演示体现上面的特性...::move(s1); Person s4; s4 = std::move(s2); return 0; } 类成员变量初始化 C++11允许在类定义时给成员变量初始缺省值,默认生成构造函数会使用这些缺省值初始化...::move(s1); return 0; } 禁止生成默认函数的关键字delete 如果想要限制某些默认函数的生成,在C++98中,是将该函数设置成private,并且只声明,这样只要其他人想要调用就会报错...::move(s1); return 0; } 继承和多态中的final与override关键字 3 -> 可变参数模版 C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板...int main() { std::liststd::pair > mylist; // emplace_back支持可变参数,拿到构建pair对象的参数后自己去创建对象

    9610

    c++ 11 新特性

    C++ 最少有 4 种不同的初始化形式,如括号内初始化,见: [cpp] view plaincopyprint?...std::string s="hello";     int x=5;     对于 POD 集合,又可以用大括号: [cpp] view plaincopyprint?...更惨的是 C++03 中居然不能初始化 POD 数组的类成员,也不能在使用 new[] 的时候初始 POD 数组,操蛋啊!...  { {"Lady Gaga", "+1 (212) 555-7890"},         {"Beyonce Knowles", "+1 (212) 555-0987"}};    而类中的数据成员初始化也得到了支持...右值引用 在 C++03 中的引用类型是只绑定左值的,C++11 引用一个新的引用类型叫右值引用类型,它是绑定到右值的,如临时对象或字面量。 增加右值引用的主要原因是为了实现 move 语义。

    96410

    《C++Primer》第十三章 拷贝控制

    一个类通过定义五种特殊的成员函数来控制这些操作: 拷贝构造函数copy constructor 拷贝赋值运算符copy-assignment operator 移动构造函数move constructor...拷贝初始化除了在我们用=定义变量时会发生,在下列情况下也会发生: 将一个对象作为实参传递给一个非引用类型的形参 从一个返回类型为非引用类型的函数返回一个对象 用花括号列表初始化一个数组中的元素或一个聚合类中的成员...s的副本 alloc.construct(first_free++, s); } pairstd::string*, std::string*> StdVec::alloc_n_copy (...- b); // 初始化并返回一个pair // 返回语句对返回值进行了列表初始化, uninnitialized_copy返回一个指向最后一个构造元素之后的指针 return...我们也可以用uninitialized_copy来构造新分配的内存。但是它对元素进行拷贝操作,标准库中没有类似的函数将元素“移动”到未构造的内存中。

    1.6K40

    阅读笔记

    ; 在上述代码中,虽然最后r1被赋值为r2,但是其仍然指向x,这样的结果就是x的值也被修改了。...{ public: explicit Vector(int sz); } move语义 自C++11起引入了move语义,不过这个很容易引起初学者的误解,其实move()本身并不做任何操作,其只是进行了简单的类型转换...: std::pair p1 = {1, 3.41}; 现在我们可以如下这样写: std::pair p2 = {1, 3.41}; 可以参考文章【ModernCpp...在这个语法中,"hello"是字符串字面值,而"s"是用户定义字面量的后缀,它将字符串字面值转换为std::string对象。...COW VS SSO COW,想必大家都清楚其原理,这个机制很常用,比较常见的如fork等操作,在STL中也有用到这个,比如gcc5.1之前的string中,先看如下代码: std::string s(

    14810

    C++ —— 剑斩旧我 破茧成蝶—C++11

    列表初始化 注意:列表初始化和初始化列表并不是同一个东西 2.1 C++98传统的{} C++98中的数组和结构体可以用{}进⾏初始化 struct Point { int _x;...容器⽀持⼀个std::initializer_list的构造函数,也就⽀持任意多个值构成的 {x1,x2,x3...} 进⾏初始化。STL中的容器⽀持任意多个值构成的 {x1,x2,x3...}...进⾏初始化,就是通过 std::initializer_list的构造函数⽀持的 int main() { std::initializer_list mylist; mylist =...图1展⽰了vs2019 debug环境下编译器对拷⻉的优化,左边为不优化的情况下,两次拷⻉构造,右边为编译器优化的场景下连续步骤中的拷⻉合⼆为⼀变为⼀次拷⻉构造 2....listpair> lt1; // 跟push_back⼀样 // 构造pair + 拷⻉/移动构造pair到list的节点中data上 pair<bit

    5500

    我天,map竟成性能瓶颈了

    ,可以确认map中对象的地址和遍历时对象的地址不相同,其并非同一个对象。...执行过程 为了验证,遍历过程中,发生了什么,可以通过自定义数据类型,并在关键函数中输出日志,通过日志确认在map遍历过程中,发生的动作有哪些。...故map中key值是以const形式存储,遍历时pair里的key的值并非const形式,由于该键不存在,则需要创建一个新的键值对。...修改方法 如上我们得出结论map中key值是const型,而在遍历中使用的pair的key值并非const型,导致需要创建新的对象,故而执行了拷贝构造函数和析构函数。...总结 本文是基于map的源码才发现实际使用中存在的问题,其中的关键点已多次强调——map的key值是const类型的,所以在使用过程中或者强制指定key为const类型或者使用auto&进行自动类型推导

    9510

    【c++】一篇文章带你了解c++11的新特性&&c++11详解

    所以最终定名为C++11 2.统一的列表初始化 2.1 {}初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。...(默认移动赋值跟上面移动构造完全类似) 如果你提供了移动构造或者移动赋值,编译器不会自动提供拷贝构造和拷贝赋值 // 以下代码在vs2013中不能体现,在vs2019下才能演示体现上面的特性。...::move(s1); Person s4; s4 = std::move(s2); return 0; } 8.2 类成员变量初始化 C++11允许在类定义时给成员变量初始缺省值,默认生成构造函数会使用这些缺省值初始化...int main() { std::liststd::pair > mylist; // emplace_back支持可变参数,拿到构建pair对象的参数后自己去创建对象...的返回值类型为id类型,id类型实际为std::thread命名空间下封装的一个类,该类中包含了一个结构体 // vs下查看 typedef struct { /* thread identifier

    19510
    领券