当前位置: 首页 > news >正文

河南省建设监理网站2022推广app赚佣金平台

河南省建设监理网站,2022推广app赚佣金平台,怎样做网站jsp,营销公司的营业范围快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、列表初始化1.1 内置类型1.2 结构体或类1.3 容器 二、声明2.1 auto2.2 decltype2.3 nullptr 三、STL的…



快乐的流畅:个人主页


个人专栏:《算法神殿》《数据结构世界》《进击的C++》

远方有一堆篝火,在为久候之人燃烧!

文章目录

  • 引言
  • 一、列表初始化
    • 1.1 内置类型
    • 1.2 结构体或类
    • 1.3 容器
  • 二、声明
    • 2.1 auto
    • 2.2 decltype
    • 2.3 nullptr
  • 三、STL的变化
    • 3.1 新增容器
    • 3.2 新增initializer_list构造
    • 3.3 新增移动构造、移动赋值和移动插入
    • 3.4 其他

引言

关于C++11的auto、nullptr和范围for的知识,在之前已经提到过,这里不再赘述,有需要的请移步这篇博客【C++练级之路】【Lv.1】C++,启动!(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for,nullptr)

一、列表初始化

C++11更新后,一切皆可用列表初始化。列表初始化,又称统一初始化,具体使用{}进行初始化。

列表初始化,沿袭C语言对于内置类型和结构体的初始化上,进行了统一形式的扩展。

1.1 内置类型

void test()
{//单一变量int i = 0;int j = { 0 };int k{ 0 };//数组int arr1[] = { 1,2,3 };int arr2[5]{ 0 };//动态开辟int* ptr1 = new int[5] {0};
}

虽然内置类型(如 int, double 等)通常不需要列表初始化,但列表初始化仍然允许。列表初始化的一个特点,就是可以去除等号“=”。

1.2 结构体或类

struct Point
{int _x, _y;
};class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}
private:int _year, _month, _day;
};void test()
{//结构体Point p1 = { 3,5 };Point p2{ 4,6 };//类Date d1(2024, 4, 10);Date d2 = { 2024,5,1 };Date d3{ 2024,6,1 };//动态开辟Date* ptr2 = new Date[3]{ d1,d2,d3 };Date* ptr3 = new Date[3]{ {2024,1,1},{2024,2,2},{2024,3,3} };
}

对于类的列表初始化,可以理解为隐式类型转换构造临时对象->拷贝构造->编译器优化为直接构造

1.3 容器

void test()
{vector<int> v1 = { 1,2,3 };vector<int> v2 = { 1,2,3,4,5 };map<string, string> dict = { {"排序","sort"},{"逆序","reverse"} };
}

对于容器的列表初始化,可不是之前的类型转换,因为此时初始化的列表是可以变长的,而之前的多参数构造是固定长度的。


那么,此时应该怎么理解容器的列表初始化呢?其实,这里涉及了STL库中的initializer_list类。

void test()
{auto il = { 1,2,3,4,5 };cout << typeid(il).name() << endl;initializer_list<int>::iterator it = il.begin();while (it != il.end()){cout << *it << " ";++it;}cout << endl;for (auto e : il){cout << e << " ";}cout << endl;
}

由上述代码可知,让编译器自动推导列表类型,便是class std::initializer_list< int >。同样的,initializer_list类也有自己的迭代器,可以用迭代器进行遍历和修改。


那么,每次容器的列表初始化过程可以理解为:将右侧构造为initializer_list ->遍历initializer_list,进行迭代器区间构造

  1. 构造initializer_list的过程:在常量区找到列表中的值,用两个指针start和finish指向头部和尾部的下一位(类似于vector的内部原理)
  2. 每个容器都添加了initializer_list的构造函数,调用对应的构造函数,运用迭代器区间进行容器构造

ps:容器既有initializer_list的构造,也有initializer_list的赋值

二、声明

C++11提供了多种简化声明的方式,尤其是在使用模板时。

2.1 auto

2.2 decltype

关键字decltype可将变量的类型声明为表达式指定的类型

void test()
{int x = 1;double y = 2.0;decltype(x) k;auto ret = x * y;vector<decltype(ret)> v;
}

decltype最大的作用,便是用来定义模板参数。因为auto没办法作为模板参数,所以decltype正好弥补了这方面的缺陷。

2.3 nullptr

三、STL的变化

3.1 新增容器

C++11更新了四个容器,分别是array,forward_list,unordered_set,unordered_map。其中unordered_set,unordered_map,我们已经深入学习和模拟实现过了。

那么,关于array和forward_list,其实带来的提升较小,实际中较少用到。

  • array:array是一个固定大小的容器,它在编译时就知道自己的大小,这使得它在性能上通常优于vector,因为它不需要在运行时进行动态内存分配和大小调整。

  • forward_list:forward_list是一个单向链表,它只包含指向下一个元素的指针,没有指向前一个元素的指针。这使得它在内存使用上比list(双向链表)更高效。

3.2 新增initializer_list构造


这点在先前列表初始化已经提到过,这是一个非常有用的提升与变化,initializer_list的引入使得 C++ 的初始化语法更加简洁、直观和灵活,提高了代码的可读性和可维护性。

3.3 新增移动构造、移动赋值和移动插入

这是非常重要的提升,可以大大提高效率。具体内容要等讲到右值引用和移动语义时会详细讲解。

3.4 其他

还比如提供了cbegin和cend方法返回const迭代器等等,但是实际意义不大,因为begin和end也是可以返回const迭代器的,这些都是属于锦上添花的操作。


真诚点赞,手有余香

http://www.hkea.cn/news/346643/

相关文章:

  • 重庆网站建设制作公司百度客服人工在线咨询电话
  • 微信公众号平台入口官网奶盘seo伪原创工具
  • 泉州网站建设公司推荐宁德市地图
  • 大厂县住房和城乡建设局网站刷百度指数
  • 低代码开发平台优缺点昆山seo网站优化软件
  • 网站开发年终总结网络营销战略的内容
  • 建立门户网站的意义营销推广网
  • 网站建设网站软件有哪些百度推广开户费用标准
  • 找家装修公司家装吉林seo外包
  • 保定医疗网站建设公司会计培训班初级费用
  • 最好的销售管理系统seo发帖网站
  • 德州乐陵德州seo公司seo批量建站
  • 贵州省建设监理协会官方网站seo代运营
  • 北京哪家做网站优化账号权重查询
  • 大唐网站建设培训管理平台
  • 男人和女人在床上做那个网站网络营销策划推广公司
  • 深圳市招投标交易中心天津谷歌优化
  • 厦门园网站忱建设百度推广怎么联系
  • 网站优化页面动态网站建设
  • 做网站域名公司每日重大军事新闻
  • 网站改版数据来源表改怎么做外链百科
  • wordpress怎样做单页网站谷歌查询关键词的工具叫什么
  • 县城做二手车网站自己建网站需要多少钱
  • 有没有专业做挂的网站引流推广方案
  • 购物网站开发文献综述百度收录需要多久
  • 营销型企业网站建设案例设计公司网站
  • 国际外贸网站电子商务
  • 南充做网站 www.xinbay.com全国免费发布广告信息
  • 备案 个人网站软件开发培训中心
  • 江苏网站建设网络推广关键词批量调词 软件