C++系统研发工程师知识储备(三)

C++系统研发工程师知识储备(一) C++ 面试 阅读详情

一、面向对象与泛型编程

STL(Standard Template Library,标准模板库)

STL是C++对泛型编程思想的实现
STL六大组件:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

(一)容器

容器其实是各种用来存放数据的数据结构,如vector、list、deque、set、map等。

  • 概念:STL容器就是将运用最广泛的一些数据结构实现出来。
  • 常用的数据结构:数组, 链表,树, 栈, 队列, 集合, 映射表 等。
  • 这些容器分为序列式容器和关联式容器两种:
    • 序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置(vector向量容器、list列表容器、deque双端队列容器)。
    • 关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系

1、vector容器(序列式容器)

基本概念:
  • 功能:vector数据结构和数组非常相似,也称为单端数组(Vector容器嵌套容器——类比二元数组)可看作一个动态数组,连续存储结构;
  • vector与普通数组区别:数组是静态空间,而vector可以动态扩展(并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间)
  • vector容器的迭代器是支持随机访问的迭代器
    在这里插入图片描述
vector构造函数
vector<T> v; //采用模板实现类实现,默认构造函数
vector(v.begin(), v.end()); //将v[begin(), end())区间中的元素拷贝给本身。
vector(n, elem); //构造函数将n个elem拷贝给本身。
vector(const vector &vec); //拷贝构造函数。
vector赋值操作
vector& operator=(const vector &vec);//重载等号操作符
assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem); //将n个elem拷贝赋值给本身。
vector容量和大小
empty(); //判断容器是否为空
capacity(); //容器的容量
size(); //返回容器中元素的个数
resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
​ //如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
​ //如果容器变短,则末尾超出容器长度的元素被删除
vector插入和删除
push_back(ele); //尾部插入元素ele
pop_back(); //删除最后一个元素
insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele
erase(const_iterator pos); //删除迭代器指向的元素
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
clear(); //删除容器中所有元素
vector数据存取
at(int idx); //返回索引idx所指的数据
operator[]; //返回索引idx所指的数据
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素
vector互换容器
swap(vec); // 将vec与本身的元素互换(swap可以使两个容器互换,可以达到实用的收缩内存效果)
vector预留空间
作用:减少vector在动态扩展容量时的扩展次数
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。

2、deque容器(序列容器)

基本概念
  • 功能:双端数组,可以对头端进行插入删除操作。队列结构,在内存中不一定连续存储;将多个连续内存空间通过指针数组连接在一起,不能保证所有元素在同一段连续的地址空间中;容器的地址空间是动态变化的,可以向两端进行伸缩,内部实现比较复杂;擅长在容器首部、尾部插入或删除元素,效率高

  • deque与vector区别:vector对于头部的插入删除效率低,数据量越大,效率越低;deque相对而言,对头部的插入删除速度回比vector快;vector访问元素时的速度会比deque快,这和两者内部实现有关在这里插入图片描述

  • deque内部工作原理:deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据;中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间在这里插入图片描述

  • deque容器的迭代器也是支持随机访问的

deque构造函数
deque<T> deqT; //默认构造形式
deque(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem); //构造函数将n个elem拷贝给本身。
deque(const deque &deq); //拷贝构造函数
deque赋值操作
deque& operator=(const deque &deq); //重载等号操作符
assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem); //将n个elem拷贝赋值给本身。
deque大小操作
deque.empty(); //判断容器是否为空
deque.size(); //返回容器中元素的个数
deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
​ //如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
​ //如果容器变短,则末尾超出容器长度的元素被删除。
deque 插入和删除
两端插入操作:
    push_back(elem); //在容器尾部添加一个数据
    push_front(elem); //在容器头部插入一个数据
    pop_back(); //删除容器最后一个数据
    pop_front(); //删除容器第一个数据

指定位置操作:
    insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
    insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
    insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
    clear(); //清空容器的所有数据
    erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
    erase(pos); //删除pos位置的数据,返回下一个数据的位置。
deque 数据存取
at(int idx); //返回索引idx所指的数据
operator[]; //返回索引idx所指的数据
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素
deque 排序
sort(iterator beg, iterator end) //对beg和end区间内元素进行排序

3、list容器(序列容器)

基本概念

  • 功能:将数据进行链式存储。容器中各个元素的前后顺序靠指针联系在一起,在内存中不一定是连续的地址空间;擅长随机插入或删除元素,只改变前后两个元素的联系,效率高;不擅于随机访问元素,遍历容器需要访问大量指针,效率极低;

  • 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。

  • 链表的组成:链表由一系列结点组成;结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

  • STL中的链表是一个双向循环链表;链表list中的迭代器只支持前移和后移,属于双向迭代器在这里插入图片描述

  • list的优点:采用动态存储分配,不会造成内存浪费和溢出;链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

  • list的缺点:链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大

  • 插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的

list构造函数
    list<T> lst; //list采用采用模板类实现,对象的默认构造形式:
    list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。
    list(n,elem); //构造函数将n个elem拷贝给本身。
    list(const list &lst); //拷贝构造函数。

list赋值和交换

    assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
    assign(n, elem); //将n个elem拷贝赋值给本身。
    list& operator=(const list &lst); //重载等号操作符
    swap(lst); //将lst与本身的元素互换。
list大小操作在这里插入图片描述
list插入和删除在这里插入图片描述
list数据存取

在这里插入图片描述

list反转和排序

在这里插入图片描述

C++系统研发工程师知识储备(八) C++ 面试 系统研发 阅读详情

相关推荐

AI工程师知识技术体系和工作内容及挑战

他们需要分析用户对语音助手的需求和期望,制定产品的功能和特点;数据科学家的知识储备:数学和统计学基础,包括线性代数、概率论、统计学和微积分,还需要有编程能力,掌握至少一种编程语言,如Python或R,数据科学相关的知识,包括数据预处理、探索性数据分析、机器学习、数据可视化等。机器学习工程师在根据业务需求选择合适的机器学习算法和模型,进行模型的开发、训练和调优,对模型进行评估和验证,以及将训练好的模型部署到生产环境的过程中,需要综合考虑业务需求、数据特性、算法选择、模型性能、评估验证以及部署运维等多个方面。

weixin_30777913的博客 1490

面试试题(C++方向)

1、C和C++的特点与区别? 答:(1)C语言特点: 1.作为一种面向过程的结构化语言,易于调试和维护; 2.表现能力和处理能力极强,可以直接访问内存的物理地址; 3.C语言实现了对硬件的编程操作,也适合于应用软件的开发; 4.C语言还具有效率高,可移植性强等特点。(2)C++语言特点: 1.在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向对象的程序设计语言...

Xiongchao99的博客 8万+

AI Pika 生成进击的巨人动漫分镜案例

AI Pika 生成进击的巨人动漫分镜案例 Pika 是一个使用AI生成和编辑视频的平台。

独立开发,substack顶级编辑 2495

C++研发工程师学习笔记(一)

首先今天我们先来说一说为什么要学习C++,以及C++研发岗位对应的工作内容,现在大厂的算法工程师,现在越来越难进了,一般来说算法工程师需要具有博士的学位或者顶级会议的论文,甚至现在很多人说就算有顶级会议的论文也不一定能够面试成功,原因是现在最出名的流行语:“内卷”。 无论是算法岗位还是研发岗位,都是需要C++的开发,同时掌握基本的·操作系统,数据结构与算法,计算机网络,数据库原理是任何一个程序员都必须具备的良好素质 ,同时机器学习算法工程师具备开发的技能可以设计出更加优化性能API给优化,因此具有一个好的C

千与编程 873

c++研发面试

作者:Simon_ 链接:https://www.nowcoder.com/discuss/23512 来源:牛客网 对自己一个月以来的内推实习做个总结。希望大家也能找到一个好实习。 :D 主要是C++研发内推实习的面试题。包括阿里云,网易游戏,腾讯,完美游戏,神马搜索。华为的面试题比较友好,感觉像聊天,所以没有记录。 阿里云(C++研发) 1面:

Watson2016的博客 4695

2017阿里巴巴实习生C/C++研发内推一面、二面经历

面经 阿里巴巴 C++ 实习生

GavinGreenson的博客 1万+

C++系统研发工程师知识储备(二)

C++ 系统研发工程师 基础知识

SiranTang的博客 914

C++系统研发工程师知识储备(六)

C++ 面试 系统工程师

SiranTang的博客 879

C++系统研发工程师知识储备(七)

C++ 面试 系统开发

SiranTang的博客 302

C++系统研发工程师知识储备(四)

C++ 面试 系统研发工程师

SiranTang的博客 1242

C++不同发展方向的知识储备

C++不同发展方向的知识储备 2017年09月10日 13:00:49 lsfreeing 阅读数 1310更多 分类专栏: 杂谈  收集自各招聘要求,基本包括了C++不同的发展方向和所要具备的基本知识和技能点。还是那句,基础最重要,不变应万变。以下收集内容供参考学习。 一 服务器程序员流媒体后台游戏后台高性能服务器后台 二应用开发工程师windows linuxc QT和MFC偏前端 C游...

zlqqwwqqw的博客 592

C++系统研发工程师知识储备(五)

C++ 系统研发工程师 面试

SiranTang的博客 708

2018 C++开发工程师面试题大合集(持续更新)

  (一)2018.4 拼多多实习服务端 1、 一个C++源文件从文本到可执行文件经历的过程 对于C/C++编写的程序,从源代码到可执行文件,一般经过下面四个步骤: 1).预处理,产生.ii文件 2).编译,产生汇编文件(.s文件) 3).汇编,产生目标文件(.o或.obj文件) 4).链接,产生可执行文件(.out或.exe文件) 2、#include 的顺序以及尖叫括号和双...

Damage 5万+

软件C++、C研发如此稀缺

  最近公司 做bim 新成立的创业公司。c++大约开到20k-25k。竟然找不到两个合适的中级研发人员。很多工作5年-10年的人,实际技术都不到3年的真实水平。最多算个初级到中级之间的。   如何对能力分级呢?   初级:给一些难度不大的简单软件模块和接口,可以基本完成,偶遇到问题,需要指导解决。软件基础知识都了解,比如语言本身,线程,网络,操作系统等   中级:可以对大模块进行模块设计分功,带...

zsyddl2的专栏 3891

c++做底层开发

呵呵,看楼主这么有志气,看来后继有人了,偶从底层转出了一段时间了,现从事JAVA,不过还是很怀念当年用汇编和C操纵底层硬件的,一切尽在掌握中的感觉---爽啊,现在的JAVA代码写得偶都要睡着了...。 v? i`ZgbP 在这里给楼主点建议: 1B]V;q)z+n,{+K 1.关于c++:对于底层来说c++基本可有可无,主要还是C,不过OO的思想还是每个CODER的基本功

happyxzxin的专栏 1万+

C++技术开发的发展方向有哪些?

一般来说作为C++开发工程师,想要获得长久发展,提升专业技能是一方面,另一方面需要确定好发展方向。那么C++技术开发的发展方向有哪些呢? C++技术开发的发展方向有哪些? 一、服务器开发,开发大型高并发服务器,熟悉多线程,网络编程,熟悉服务器的架构模型; 二、应用开发,开发各种实用的界面工具,使用界面库做各种炫酷的软件应用,偏向于前端; 、图像处理,图像算法,人脸识别等各种图像数据后期处理,偏向于算法,需要拥有良好的基础; 四、流媒体开发,专注于各种音视频解码转码,媒体复用,负载均衡,熟悉各种开源播放库解

kaikeba的博客 8976

C++研发工程师基本知识

1、面向对象的思想是什么? 答:就是把数据结构和对数据结构的操作封装在一个类里面。2、什么是类? 答:把一些具有共性的对象集结成一个集合,这个集合就是类。3、对象都具有两方面的特征,他们是什么? 答:对象都具有静态和动态的特征。 静态特征是指对象的一些本质属性,动态特征是指对象所表现出来的一些行为。4、在头文件中进行对类的声明,在实现文件中进行对类的定义,这样做有什么意义? 答:这样做有利

qq_34022469的博客 1096

面试c++研发工程师需要看哪些书

本文主要是我现阶段对将要学习的几本书的罗列,并不保证对大家有用,如果没兴趣可以不用继续看下去了,谢谢。如果你有什么建议和指导,欢迎交流,谢谢! 1.对linux C 编程的学习。PS: Linux是一个非常经典的系统,熟练的掌握它能够让你后面的学习变得更加高效和深入。 《linux C 编程》、《linux 操作系统原理与运用》 2.对c++能有一个良好的基础和深入的认识。PS: 不管学什么

Android罗先生的博客 4221

YooAsset 2.2.12四层加密架构:跨平台资源安全实战指南

AssetBundle加密是Unity热更新安全的核心环节,其本质是通过算法、密钥管理与生命周期协同实现资源全链路防护。传统方案常陷于‘打包后加密’的误区,导致内存开销大、跨平台兼容差、逆向防护弱。YooAsset 2.2.12提出打包层、传输层、加载层、运行层四层防护架构,将加密前置到资源序列化前,并依托BundleHeader实现动态算法协商与密钥分发,显著提升iOS/Android/WebGL端一致性。该方案兼顾AES-128等通用算法与SM4等国密支持,同时通过IMemoryDecryptor实现

weixin_32428571的博客 376

Adodb Premiere Pro 导入MKV格式文件插件

Adodb Premiere Pro 导入MKV格式文件插件

上一篇: C++系统研发工程师知识储备(二)
下一篇: C++系统研发工程师知识储备(四)
SiranTang
博客等级 码龄9年 8粉丝 · 68原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值