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

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器

为什么这个东西可以赋值给vector呢? ,大家看红色圈出来部分,C++11给STL中这些容器增加了这样一个构造函数。...支持用initializer_list类型对象去构造vector这些容器。 所以正常使用这个构造应该是这样写: 那我们写成这样 当然也可以,因为构造函数支持隐式类型转换嘛。...它可以构造函数函数参数中以列表形式传递一组。...可以认为它就是一个常量数组,存储常量区,initializer_list对象中元素永远是常量值,我们无法改变initializer_list对象中元素。...实际上C++11更新,容器中增加新方法最实用就是插入接口函数引用版本 那关于这里3、4两点提到引用和移动语义我们后面也会花大量篇幅给大家讲解… 8.

16110

C++11『基础新特性』

其实就是当内置类型使用 { } 初始化时,实际上是调用构造函数进行构造 这就不奇怪了,无非就是让内置类型将 { } 也看做一种特殊构造构造 + 赋值 优化为 直接构造 我们可以通过一个简单...{ 1, 2, 3, 4, 5 }; return 0; } 不止可以初始化五个数,初始化十个乃至一百一千个都是可以,显然此时 列表初始化 调用不是 vector 构造函数,因为它构造函数总不可能重载出...所以对于诸如 vector 这种自定义类型来说,需要把 列表初始化 视作一个类型,然后重载对这个类型参数构造函数就行了,于是 initializer_list 类就诞生了,这是一个模板类,大概长这样... 构造函数就好了,比如这样 重载了 initializer_list 构造函数 ---- 位于 vector 类(自己模拟实现) // 供列表初始化调用 vector(const...简单来说就是 构造即初始化,析构则销毁,利用对象创建时需要调用 构造函数,生命周期结束时会自动调用 析构函数 特性 智能指针 就是一个对象,一个构造时申请资源,析构时释放资源小工具,仅此而已 5.2

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

【C++】C++11常用特性总结

例如匿名对象,传返回函数调用返回等,因为匿名对象在其所在代码行执行完毕就会被销毁,并且传返回函数调用实际利用了中间生成一个临时变量将返回从被调用函数栈帧即将销毁时带出,这个临时变量一旦被接收...通过运行结果也可以看出,当wyn::string内部实现了移动构造,list插入数据时,如果插入数据是右new结点调用struct node结点构造函数时,会调用string类移动构造,我们自己实现...知道上面的知识,也就能解释为什么移动构造或移动赋值或右引用版本插入等等接口参数都是普通右引用了,因为这些接口都要对右进行资源移动,也就是改变右引用引用对象,所以右引用时候必须是普通引用...那如果在函数模板内部,要调用Fun函数呢?我们想保证调用时候,依旧可以调用到对应参数类型函数,也就是保持参数属性不变。...sort内部进行排序时候,会依次向后两两比较vector元素,比较时就会用我们传调用对象进行比较,然后给可调用对象传两个vector元素过去,根据比较结果开始进行排序,所以lambda表达式和仿函数对象一样都是可调用对象

77340

【C++】C++11——简介|列表初始|简化声明|nullptr与范围for|STL中变化

}; return 0; } vector和list为什么可以这样子初始化,这就要说到一个新容器了:initializer_list initializer_list 是一个容器,是 C++11...C++11引入initializer_list才支持,而这些容器之所以支持使用列表进行初始化,是因为C++11提供了一个构造函数,以initializer_list为参数 看一下C++11vector...构造: 当用列表对容器进行初始化时,会被认为是initializer_list类型,此时不管有多少个都能够被初始化vector。...而我们之前自己实现vector是无法支持,现在我们可以为之前自己模拟实现vector提供一个构造函数:遍历initializer_list元素,然后push_back进要初始化容器当中:...因为array用一个类对数组做了封装,并且访问array容器中元素时会进行越界检查:用[]访问元素时采用断言,调用at成员函数访问元素时采用抛出异常检查。

19020

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

z(0); // 错误 }; 不可拷贝对象,初始化时不可使用=赋值,但可以使用{}、() std::vector ai1{0}; // 没问题,调用构造函数 std::atomic...另外,构造函数有参数情况中,若不包含std::initializer_list参数或者 构造未传入实参,()和{}产生一样效果,否则{}优先匹配std::initializer_list参数构造函数...w8{std::move(w4)}; // 使用花括号,调用std::initializer_list构造函数 接着上述,使用{}初始化时,只要参数能强转换为initializer_list...构造重载匹配中,只要参数能够强转std::initializer_listT,就会匹配std::initializer_list构造函数,即便有更加匹配构造函数。...其内部实现尽量不要有修改共享资源操作(即尽量不要有修改公共变量操作,否则用锁保护),且内部尽量少调用其他函数,因为被调用函数也可能存在线程不安全风险。 17.

17020

初始化|这些年踩过

v2{std::vector{1, 2}}; 在上述代码中v1有3个,分别为1 2 3,那么按照该规则,v2类型岂不是std::vector>,一开始学习这块时候...编译器有个特点,对于以花括号初始化方式则认为是统一初始化,如果构造函数中同样存在std::initializer_list为参数构造函数,那么则优先调用: class MyClass { public...{ MyClass obj{5, 1.0}; }; 我们可能期望MyClass obj{5, 1.0};调用第一个构造函数(以int和double作为参数构造函数),但由于存在以std::initializer_list...试想一下,如果不涉及缩小转换(例如,第二个构造函数接受 in std::initializer_list,则代码将使用第二个构造函数初始设定项列表中int 5转换为double 5.0...)默默执行,而开发人员则认为它正在使用第一个构造函数,emm,后果不堪设想~~ 在上面提了,编译器会优先调用参数为std::initializer_list构造函数,但是有个例外: class MyClass

16610

【C++】C++11中常见语法(上)

类型,这是 C++11 新增加类型,每个容器都增加了使用 initializer_list 构造函数,数据被识别成 initializer_list 类型调用相应构造函数进行初始化,参考文档:...所以我们如果在以前模拟实现 vector 中使用 initializer_list 去初始化对象时候,是会报错,因为我们以前没有写相应构造函数initializer_list 构造函数也很简单...右引用和移动语义: 首先我们 Young::string 中增加移动构造,移动构造本质是将参数右资源窃取过来,占位已有,那么就不用做深拷贝了,所以它叫做移动构造,就是窃取别人资源来构造自己,为什么可以直接窃取别人资源呢...然后把这个临时对象做为 Young::to_string 函数调用返回赋值给接收 ret,这里调用移动赋值。...默认成员函数 原来 C++ 类中,有 6 个默认成员函数构造函数 析构函数 拷贝构造函数 拷贝赋值重载 取地址重载 const 取地址重载 最后重要是前4个,两个用处不大。

14710

C++11简单介绍(上)

使用场景: std::initializer_list一般是作为构造函数参数,C++11对STL中不少容器就增加std::initializer_list作为参数构造函数,这样初始化容器对象就更方便了...//initializer_list作为vector构造函数参数 vector(initializer_list l) { _start = new T[l.size...不仅仅有移动构造,还有移动赋值: jh::string类中增加移动赋值函数,再去调用jh:to_string(1234),不过这次是将jh::to_string(1234)返回对象赋值给ret1...**然后把这个临时对象做为jh::to_string函数调用返回赋值给ret1,这里调用移动赋值。...: 然而使用完美转发: 可以看到最后一次输出结果不一样,完美转发完美地保留了对象原生类型属性 完美转发实际中使用场景: 如果你使用函数调用其他函数来实现,那么你调用函数也要进行完美转发修饰

8310

C++中五花八门初始化规则

内置类型默认初始化 Tips:建议初始化每一个内置类型变量,原因在于定义函数内部内置类型变量是未定义,如果试图拷贝或者以其他形式访问此类是一种错误编程行为且很难调试。...定义于任何函数体之外变量会被初始化为0,定义函数内部内置类型变量将不被初始化(uninitialized),一个未被初始化内置类型变量时未定义,如果试图拷贝或以其他形式访问此类将引发错误...定义于任何函数体之外类变量会先进行零初始化再执行默认初始化,定义函数内部类变量会直接执行默认初始化。...class Cat { public: int age; }; int main() { /* 内置类型函数内部默认初始化, 随机 */ int int_array[...如果初始化时使用了花括号但是提供又无法用来列表初始化,那么就考虑用这些调用vector构造函数了。

2.5K10

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

相比于 C++98/03,C++11则带来了数量可观变化,其中包含了约140个新特性,以及对C++03标准中 约600个缺陷修正,这使得C++11更像是从C++98/03中孕育出一种新语言。...2 -> 统一列表初始化 2.1 -> {}初始化 C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一列表初始设定。...fyd p{ 1, 2 }; // C++11中列表初始化也可以适用于new表达式中 int* pa = new int[4]{ 0 }; return 0; } 创建对象时也可以使用列表初始化方式调用构造函数初始化...d1(2024, 4, 1); // C++11支持列表初始化,这里会调用构造函数初始化 Date d2{ 2024, 4, 2 }; Date d3 = { 2024, 4, 3 };...一般是作为构造函数参数,C++11对STL中不少容器就增加 std::initializer_list作为参数构造函数,这样初始化容器对象就更方便了。

5210

C++11特性大杂烩

如果没有实现,那么编译器会走initializer_list构造函数图片vector支持initializer_list初始化和赋值简易代码如下templateclass vector...,每结合一个元素,执行依次循环体,直至容器内所有元素都被结合完为止.不依赖于下标元素,(通用于stl库容器)不需要访问迭代器,透明不需要定义处理函数,简洁图片stl库中一些变化根据C++官网可以查到容器...(x);//move之后可以右引用那好端端有了引用(左引用),为什么还要在C++11提出右引用呢?...,但是报错了,原因是此时捕捉列表捕捉是父作用域变量值拷贝,具有常性无法改变且lambda函数总是一个const函数,可以参数列表加mutable表示取消参数常性添加mutable运行,通过打印查看参数...(部分场景提高效率)包装明确了可调用对象返回和参数类型,更加方便使用。bindstd::bind函数定义头文件中,是一个函数模板,它就像一个函数包装器(适配器)。

87950

【C++11特性篇】C++11中新增initializer_list——初始化小利器(2)

C++11对STL中不少容器 (vector,list,map…) 就 增加std::initializer_list作为参数构造函数 ,这样初始化容器对象就更方便了 std::initializer_list...也可以作为operator=参数 ,这样就可以用大括号赋值 三.对比【C++11特性{ }隐式类型转换】&【调用initializer_listvector构造函数】不同原理 C++11中新增关于...{}用法 (传送门):具体对象是下面代码中Point, 直接调用两个参数构造 – 隐式类型转换 我们vector容器构造函数参数是std::initializer_list, 这里是调用initializer_list...vector构造函数 struct Point { //explicit Point(int x, int y)//调用后,可不让其隐式类型转换 Point(int x, int y)...不同规则 vector v1 = { 1,2,3,4,3}; // 调用initializer_listvector构造函数 Point p1 = { 1,1}; // 直接调用两个参数构造

26510

C++11常用一部分新特性

; int main() { vector arr{1, 2, 3, 4, 5, 6};//这里初始化为什么可以随意改变元素数量呢?...注意:C++11给右分为 纯右(内置类型) 将亡(自定义类型) 那么to_string函数中返回了一个将亡,如果在进行拷贝构造有些没必要: 那么这里进行拷贝传时候就会传给移动构造函数...,移动构造函数内部其实就是交换两个对象,反正将亡也要销毁了,这样就不用进行深拷贝了。...右 return 0; } 这里只会调用前两个函数,因为func中参数x都是左属性,这里就需要一个叫完美转发传参过程中保持了 x 原生类型属性。...a));//找到之后就将栈中两个通过map中储存包装器中lamber表达式进行运算,这里要注意数顺序,先去取出来左边,取出来右边 }

390110

【C++】STL 容器 - vector 动态数组容器 ③ ( vector 容器初始化 - 初始化列表 | vector 容器赋值 - assign 函数 swap 函数 )

: 通过传递两个迭代器来指定要复制元素范围 ; // 初始化一个 vector 容器 vector vec1 {1, 2, 3}; // 使用 范围构造函数 从 vec1 容器中 复制元素到...vec2 容器 vector vec2(vec1.begin(), vec1.end()); 2、使用 std::initializer_list 初始化列表 初始化 vector 容器 之前有参构造函数中...使用 拷贝构造函数 创建 vec3 容器 // 将其初始化为 vec1 副本 vector vec3(vec1); // 5....; 执行结果 : 二、 vector 容器赋值 vector 容器初始化时 , 可以设置初始化 , 在上一个章节中已经进行了讨论 ; vector 容器初始化完毕 , 要想再 修改 vector...将 vec2 容器中替换为 3 个 int 类型数据 8 vector vec2; vec2.assign(3, 8); assign 函数赋值 : 清空容器中所有元素 , 并用新分配元素填充容器

62310

C++11标准常用特性---统一初始化

; 4、标准容器统一初始化 C++11之前初始化一个vector,需要调用多次push_back函数进行初始化。...测试结果.png 6、对象构造改进 C++11以前类构造函数不允许调用该类其它构造函数;每个构造函数都必须自己或者调用一个公共成员函数构造全部成员.例如: class SomeType1...C++11为这些问题提供了解决方案.C++11允许构造函数调用另一个构造函数(叫做委托构造).这允许构造函数利用其它构造函数行为而只需增加少量代码.C#,java和D语言都提供了这种功能....() : SomeType1(42) {} private: int number; }; 注意:这个例子可以通过给new_number设定一个默认参数来达到相同效果.但是,这种新语法可以让这个默认实现中来设置而不是接口中设置....这带来一个好处就是,对库代码维护者而言,接口中(头文件中)声明默认,这个默认被嵌入到了调用端;要改变这个默认的话,调用代码都需要重新编译.但委托构造可以实现中(CPP文件中)来改变这个默认

70630

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

Widget w2 = w1;//并非赋值,调用是复制构造函数 //w1 = w2;//并非赋值,调用是复制赋值运算符 //普遍性:大括号初始化 //1, STL容器 std::vector<int...复制构造函数 // WidgetBB w6{w444};//大括号,调用是带有 std::initializer_list型别形参构造函数,w4返回被强制转成成 float,随后 float又被强制转成了... il);//带有形参构造 }; WidgetA1 ww;//调用是默认构造 WidgetA1 WWW{};//依然是默认构造 WidgetA1 WWWW();//变成函数声明了,令人头疼语法...//如果的确想调用一个带有 std::initializer_list 型别形参构造函数,并传入一个空 std::initializer_list的话 //可以通过把空大括号对作为构造函数实参方式实现这个目的...//如果 processPointer是 Widget内部得一个成员函数模板,而你想禁止使用 void*指针来调用 //通不过编译得做法 //通不过编译得做法 class Widget{ public

1.7K30
领券