STL和C++11

news2024/9/21 17:56:32

1 补充知识点

c与c++区别
c语言和C++不能说一个面向过程,一个面向对象

  • 面向过程和面向对象只是一种编程思想,不是针对某一种语言的。Linux内核中的C语言就是运用面向对象的思想编写的。
  • 只是说,在实现面向对象编程时,C++提供的语法实现起来比C语言更方便;仅此而已。

g++编码选项

  • -std=c++11 表示使用c++11的标准来编译。因为C++11基本上是行业标准
  • -ansi 关闭gnu的特性,使代码全面符合ansi要求,从而具有高移植性。避免包含一些只有gnu独有的语法

c/c++ extern关键字

声明函数或变量。函数可以省略,但变量省略就成定义了,而不是声明。声明不会分配内存,而定义会占用内存空间

c++ const关键字与c语言差别:

  • C++ 对 const 的特性做了调整,C++ 规定,全局 const 变量的作用域仍然是当前文件,在其他文件中是不可见的,这和添加了static关键字的效果类似
  • 使用的是 GCC,那么可以通过添加 extern 关键字来增大 C++ 全局 const 变量的可见范围,其他文件使用 extern 声明后就可以使用了。

c++ new 和 delete

C++ 中的 new 和 delete 分别用来分配和释放内存,它们与C语言中 malloc()、free() 最大的一个不同之处在于:

  • 用 new 分配内存时会调用构造函数,用 delete 释放内存时会调用析构函数。构造函数和析构函数对于类来说是不可或缺的,所以在C++中我们非常鼓励使用 new 和 delete。

对指针的理解

  • 基本类型变量仅仅是地址的注记符而已,这个变量就是数据的内存首地址,假如数据类型为int,则从首地址开始的连续四个内存地址,都用来存储这个int类型的数据。
  • 编译时,会将变量名替换为首地址
  • 而指针变量,它注记指代的内存块,存储的不是数据,而是另一片内存地址,而这另一片内存地址才是真实的数据。
  • 所以:使用指针是间接获取数据,使用变量名是直接获取数据,前者比后者的代价要高
    在这里插入图片描述

2 STL(standard Template Libray)

模板所支持的类型是宽泛的,没有限制的,我们可以使用任意类型来替换,这种编程方式称为泛型编程
STL是基于泛型编程思想,利用模板技术。包含了计算机科学领域常用的基本数据结构和基本算法

2.1 顺序容器

顺序容器(也称"序列式容器")将一组具有相同类型的元素****以严格的线性形式组织起来。主要分为三类: vector、deque、list

vector:

  • 内部实现实际上是动态数组,存取任何元素都能在常数时间内完成,在尾端增删元素具有较佳的性能;头部插入要整体移动所有数据,效率低
  • vector有多个构造函数,默认的构造函数是构造一个初始长度为0的内存空间,且分配的内存空间是以2的倍数动态增长的,在push_back的过程中,若发现分配的内存空间不足,则重新分配一段连续的内存空间,其大小是现在连续空间的2倍,在将原先空间中的元素复制到新的空间中,性能消耗较大。
  • 随机访问效率高

deque:

  • 类似vector的结构,随机访问效率高。
  • 不同之处:vector还维护首地址,双端插入的效率都很高;vector按块存储,在扩展空间的时候新增一个块,不用复制,效率较高

list

  • 双向链表结构
  • 随机访问效率低,都要遍历
  • 高效的随机插入/删除操作;尤其在首尾 插入,效率很高,只需要改变元素的指针。

2.2 关联容器之set、multiset、map、multimap

关联容器内的元素是排序的,插入任何元素,都能按照相应的排序准则来确定位置,特点是在查找时具有非常好的性能,通常以平衡二叉树方式实现,插入和检索的时间都是O(logn)

set和multiset

  • set是一种关联性容器,底层使用红黑树实现,插入删除操作时仅仅移动指针即可,不涉及内存的移动和拷贝,所以效率比较高
  • set中的元素都是唯一的,而且默认情况下会对元素进行升序排列
  • set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同

map和multimap:

  • map容器提供一个键值对(key/value)容器,map与multimap差别仅仅在于multiple允许一个键对应多个值
  • map内部自建一棵红黑树(一种自平衡二叉树),这棵树具有数据自动排序的功能,所以在map内部所有的数据都是有序的,以二叉树的形式进行组织

2.3 容器适配器adapter

适配器(Adaptors)是标准库中的一个通用概念,容器、迭代器和函数****都有适配器。本质上,一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样。一个容器适配器(Container adaptors)在一种已有的容器类型上面进行包装,使其行为看起来像一种不同的类型

标准库定义了三个序列容器适配器

  • stack: 栈,先进后出;底层使用deque
  • queue:队列,先进先出;底层使用deque
  • priority_queue: 优先级队列:优先级大的先出队,底层数据结构默认是大根堆。优先级队列底层默认把数据组成一个大根堆结构,而大根堆的构建就需要在一个内存连续的数组上(堆中结点和它左右孩子的关系是通过下标计算的),vector动态数组底层是绝对连续的,而deque是分段连续的,所以用vector

迭代器

迭代器用于遍历对象集合的元素,从实现角度来看,**迭代器是一种将***operator、operator->、operator++、operator–**等指针操作予以重载的class template

2.4 函数对象

如果一个类将()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象。函数对象是一个对象,但是使用的形式看起来像函数调用,实际上也执行了函数调用,因而得名。


3 C++11

C++11标准,就是新增的特性

1 auto关键字

auto关键字和static关键字区别:
1、static变量存放在静态存储区,在程序整个运行期间都不释放;而auto变量存放在动态存储区,随着生命周期的结束而立即释放。
2、static变量只赋值一次,以后就不用赋值;而auto变量在函数每调用一次都要赋初值。
3、如果用户不对static变量赋初值,则默认为0或’\0’;而auto变量为不确定值。

c++默认就是auto,所以auto关键字写和不写没区别。

C++11给auto关键字赋予了新的含义:

  • 使用它来做自动类型推导。也就是说,使用了 auto 关键字以后,编译器会在编译期间自动推导出变量的类型,这样我们就不用手动指明变量的数据类型了

nullptr关键字

用nullptr表示空指针

更优雅的初始化方法

C++11之前,只有数组能使用初始化列表:int arr[3] = {1, 2, 3}
c++11开始,各种数据类型都可以用初始化列表来初始化:map(int, string){{1, "hello"}, {2, "hh"}};

基于范围的for循环

void foo() {
    vector<int> v{1, 2, 3};
    for (auto x:v) {
        cout << x << endl;
    }
}

编译断言:static_assert

编译期间断言:

// c++ 11 compile-time assert
static_assert ( bool_constexpr , string ) 

// bool_constexpr: 常量表达式(不能包含变量)string: 
// 如果bool_constexpr表达式为false, 这个string就是编译时候报的错误

// run-time assert
assert(ptr != NULL)

lambda表达式

格式

[capture list] (params list)mutable exception-> return type {  
    function body
}

除了捕获列表[capture list],其他项参数列表、mutable、异常、返回类型都可以省略

捕获列表的捕获方式和捕获范围
在这里插入图片描述

function对象包装器

可以降不同的可调用对象,包装成一个类模板,从一个入口统一调用:functon<return type<typename, ...>>

bind

类似python的偏函数,将可调用对象的部分函数固定起来。

auto x = [](int a, int b) {
    return a+b;
}

auto y = bind(x, 1, 2);
cout << y() << endl;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2127551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性因子模型 - PCA的流形解释篇

序言 线性因子模型&#xff0c;作为数据降维与特征提取的重要工具&#xff0c;在机器学习和统计分析领域发挥着关键作用。其中&#xff0c;主成分分析&#xff08; PCA \text{PCA} PCA&#xff09;作为线性因子模型的一种经典形式&#xff0c;其流形解释为我们深入理解数据结构…

VBA V3高级视频行为分析系统(含源码)

项目介绍 VBA V3是一个高级的视频行为分析系统&#xff0c;旨在通过实时或离线视频流来检测和分析人类的行为模式。该系统可以识别多种行为&#xff0c;如入侵检测、跌倒检测、异常行为识别等&#xff0c;并能提供实时警报和详细的行为报告。系统的设计充分考虑了易用性和扩展…

3GPP协议入门——物理层基础(三)

1. 栅格 1.1 全局栅格 5G频段范围是0-100GHz,在这100GHz的范围内&#xff0c;划分出了3279165个栅格&#xff0c;这些栅格从0开始编号&#xff0c;一直到编号3279165&#xff0c;每一个编号都代表一个绝对的频域位置&#xff0c;这些编号就叫做NR-ARFCN。   编号和频率范围如…

汽车免拆诊断案例 | 2013款捷豹XF车偶尔无法起动

故障现象 一辆2013款捷豹XF车&#xff0c;搭载3.0 L机械增压发动机&#xff08;型号为AJ126&#xff09;&#xff0c;累计行驶里程约为20.6万km。车主反映&#xff0c;该车发动机偶尔无法起动&#xff0c;同时组合仪表上会提示很多故障信息&#xff1b;多按几次起动按钮或等待…

【GeekBand】C++设计模式笔记1_介绍

课程目标 理解松耦合设计思想掌握面向对象设计原则掌握重构技法改善设计掌握GOF核心设计模式 什么是设计模式 目标&#xff1a;复用&#xff0c;以不变应万变 GOF设计模式 从面向对象谈起 深入理解面向对象 向下&#xff1a;深入理解三大面向对象机制 封装&#xff1a;隐藏…

linux驱动开发-磁盘管理

在Linux系统中&#xff0c;mount命令是一种非常常见且有用的工具&#xff0c;用于将文件系统连接到指定的挂载点。通过使用mount命令&#xff0c;管理员可以访问和管理存储设备上的文件和目录&#xff0c;包括硬盘驱动器、CD或DVD驱动器、闪存驱动器等。 一、mount基本语法 mo…

非线性规划及其MATLAB实现

目录 引言 非线性规划的基本模型 非线性规划的求解方法 非线性规划的MATLAB实现 例子&#xff1a;多目标优化问题的非线性规划求解 表格总结&#xff1a;MATLAB常用非线性规划函数 实例&#xff1a;使用MATLAB求解非线性投资决策问题 结论 引言 非线性规划&#xff08;…

Haskell中的数据交换:通过http-conduit发送JSON请求

无论是客户端与服务器之间的通信&#xff0c;还是服务之间的API调用&#xff0c;都需要一种高效、可靠的方法来传输数据。在众多编程语言中&#xff0c;Haskell以其强大的类型系统和函数式编程特性&#xff0c;为构建可靠和高效的数据交换提供了坚实的基础。本文将介绍如何在Ha…

基于ssm+vue+uniapp的食堂线上预约点餐系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

亚信安慧AntDB-M 只读事务提交优化

一、事务操作介绍 数据库系统一般有三种开启和提交事务方法&#xff1a; 配置autocommit1时&#xff0c;隐式开启事务&#xff0c;每执行一条DML的SQL语句&#xff0c;数据库系统会隐式的自动执行commit逻辑提交事务&#xff0c;不需要用户输入commit执行提交。 配置autocomm…

Qt第三课 ----------按钮的控件属性

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

视频推拉流/直播点播EasyDSS平台安装失败并报错“install mediaserver error”是什么原因?

TSINGSEE青犀视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外&#xff0c;平台还支持用户自行上传视频文件&#xff0c;也可…

openeuler-无法dnf安装包问题

有个openEuler release 22.09系统机器&#xff0c;需要dnf安装些包等 [rootlydb ~]# more /etc/openEuler-release openEuler release 22.09 [rootlydb ~]# dnf -y install lrzsz OS …

【C++】Stack

个人主页~ Stack 一、Stack的介绍和使用1、stack的介绍2、stack的使用3、stack的模拟实现 二、容器适配器1、什么是适配器2、容器适配器的使用 三、deque1、原理介绍2、deque的使用3、deque的缺陷 一、Stack的介绍和使用 1、stack的介绍 stack详细解释 stack是一种容器适配器…

onlyoffice 使用记录(前端开发角度)

前端和Web文档生成器服务器交互 对于与 Web 文档生成器服务的交互&#xff0c;使用 POST 请求。 请求参数在请求正文中以 JSON 格式输入。 请求被发送到 https://documentserver/docbuilder 地址&#xff0c;其中 documentserver 是安装了 ONLYOFFICE 文档服务器的服务器的名称…

创新实验报告VC++案例开发十二生肖的俄罗斯方块智力游戏完整代码设计方案

一&#xff0e;项目名称 十二生肖俄罗斯方块 二&#xff0e;开发背景&#xff1a; 俄罗斯方块是一个很低古老的一个小游戏&#xff0c;到但今日它还有很大的魅力。 三&#xff0e;技术路线或工作原理&#xff1a; 采用的软件及开发平台 Micosoft Visual 6.0 项目的总体方…

1.安卓逆向-说明

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 正常来爬一个app的数据&#xff0c;在没有加密的情况下&#xff0c;就不需要去逆向&#xff0c;app没有加密也就可以正…

SprinBoot+Vue高校就业管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

RickdiculouslyEasy--CTF-综合靶场

废话不多说&#xff0c;一个靶机&#xff0c;好几个flag&#xff0c;开整&#xff01;&#xff01;&#xff01; 使用命令如下&#xff0c;来进行主机发现。 netdiscover -r 172.16.1.10 找到目标靶机 扫描端口 nmap 172.16.1.7 -p 1-65535 依次访问 第一个flag 9090端口 第…

使用CUBE_MX实现STM32 DMA 功能(存储器到存储器)

目录 一、使用DMA实现从存储器1发送数据到存储器2中 1.CUBE_MX配置 2.KEIL5配置 一、使用DMA实现从存储器1发送数据到存储器2中 1.CUBE_MX配置 1.在DMA选项中添加MEMORY TO MEMORY 选择数据宽度&#xff0c;并确保地址递增功能打开。 2.系统时钟72MHz 3.生成代码 2.KEIL5配…