C++知识点小结(趁热搬砖三年半的小码农) 2020年07月2日整理

2023-05-16

c++最好用易用的新特性:

  • auto/decltype    https://blog.csdn.net/zyc2018/article/details/93591189
  • nullptr               
  • range-for
  • using

c++有哪些坑?

内存泄漏的解决方案:

  1. 智能指针 
  2. 内存池

学习优秀的c++源码

  1. Nginx
  2. Leveldb
  3. Envoy
  4. Folly
  5. Boost
vector<int> month;
    int cnt=1;
    month.push_back(3);
    for(int i=3;i<=monthCount;i++)
   {
        for(auto &e:month)
        {
            e++;
        }
        for(auto e:month)
        {
            if(e>=3)
            {
                cnt++;
                month.push_back(1);
            }
        }
    }


这段代码外层for中嵌套了两个range-for,但是第一个可以用,第二个是不行的,你看出原因了么?
第二个错误在于:range-for中向遍历的vector中添加了元素。

先给出结论:不能在range-for的循环体中改变遍历的容器的大小,即不允许遍历的同时添加或删除元素!
至于原因,其实也不难理解:

我们都知道,凡是使用了迭代器的循环体中都不能向迭代器所属的容器添加元素!(C++primer,5e,P99)

因为对于某些容器,向容器中添加或删除元素会导致迭代器失效,因此后续遍历操作都是未定义的。而STL各种容器失效的时机是不同的,感兴趣的可以参考这位大神的博客:http://blog.csdn.net/yangquanhui1991/article/details/52077562,所以才有C++primer中的上述金玉良言。
再回过来看为何range-for也不可以呢?

这是因为range-for底层实现时预存了容器的end()值,而一旦遍历的时候向该容器添加或删除元素,就会使该预存的end()失效,由上述迭代器失效的问题,就不难明白:range-for的循环体中不允许对该容器添加或删除元素!

因此上面代码中的第二个range-for应该改成普通for循环,并且不能使用迭代器遍历:

    vector<int> month;
    int cnt=1;
    month.push_back(3);
    for(int i=3;i<=monthCount;i++){
        for(auto &e:month){
            e++;
        }
        for(int i=0;i<month.size();i++){//不能使用range-for或迭代器遍历!
            if(month[i]>=3){
                cnt++;
                month.push_back(1);
            }
        }
    }

其实range-for的这个陷阱在C++ primer第五版里已经做出了警示,当时看书时也做了记号,只是这种问题真的只有自己犯过一两次错误后才能记得!而且这种错误一旦发生,很难发现错误根源,编译期无错误无警告,而且运行时不同编译器执行的结果可能不一样!因为迭代器失效后再执行后续循环将是未定义的行为,所以C++primer建议如果使用迭代器遍历,每次在插入或删除元素后都应该重新定位迭代器,对于这点在写程序时一定要有一个清醒的认识。


C++中#define宏定义的min与max函数

#define min(a,b) ((a) < (b) ? (a) : (b))

#define max(a,b) ((a) > (b) ? (a) : (b))

这样代码效率会特别高,比库函数要快

C++ explicit关键字详解

C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。

 explicit关键字的作用就是防止类构造函数的隐式自动转换。

explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了。

1、3次握手和4次挥手
2、TCP与UDP的区别
3、如果TCP连接出现问题该如何排查,说明排查的思路
连接断开或者出错,会返回一个错误码,errorNo  最后一次系统调用返回的错误码,来看错误的类型。
4、三元组算法问题
5、查询linux系统中的cup和内存占用率
如果查到具体是哪一个进程占用的比较多,你会怎么做?
如何能够降低程序的cpu或者内存的占用率

看是网络程序占用的还是业务逻辑计算功能占用的
如果是网络连接程序,你把网络断了,它还占用那么大,那么网络程序写的有问题
如果是逻辑计算功能占用,我把它的所有数据输入都去掉,如果它还占用那么大,那么业务逻辑计算程序就写的有问题。

6、什么时候使用多线程,什么时候使用多进程
7、单例模式在什么情况下使用,有什么好处
8、对于临界资源的访问有哪几种控制方式


9、什么是原子操作
10、有没有使用过线程池?

11、什么是互斥锁,什么是自旋锁?

读写锁特点:

读写锁有三种状态:读加锁状态、写加锁状态和不加锁状态 

只有一个线程可以占有写状态的锁,但可以有多个线程同时占有读状态锁,这也是它可以实现高并发的原因。

当其处于写状态锁下,任何想要尝试获得锁的线程都会被阻塞,直到写状态锁被释放;

如果是处于读状态锁下,允许其它线程获得它的读状态锁,但是不允许获得它的写状态锁,直到所有线程的读状态锁被释放;

为了避免想要尝试写操作的线程一直得不到写状态锁,当处于读模式的读写锁接收到一个试图对其进行写模式加锁操作时,便会阻塞后面对其进行读模式加锁操作的线程。 即当读写锁感知到有线程想要获得写状态锁时,便会阻塞其后所有想要获得读状态锁的线程。这样当读模式的锁解锁后,要获得写状态锁的线程能够访问此锁保护的资源。所以读写锁非常适合资源的读操作远多于写操作的情况。

1)多个读者可以同时进行读

2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)

3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)

 

互斥锁特点:

在访问共享资源之前对进行加锁操作,在访问完成之后进行解锁操作。 加锁后,任何其他试图再次加锁的线程会被阻塞,直到当前线程解锁。 如果解锁时有一个以上的线程阻塞,那么所有该锁上的线程都被编程就绪状态, 第一个变为就绪状态的线程又执行加锁操作,那么其他的线程又会进入等待。 在这种方式下,只有一个线程能够访问被互斥锁保护的资源。

一次只能一个线程拥有互斥锁,其他线程只有等待

 

自旋锁特点:

自旋锁是一种特殊的互斥锁,当资源被枷锁后,其他线程想要再次加锁,此时该线程不会被阻塞睡眠而是陷入循环等待状态(CPU不能做其它事情),循环检查资源持有者是否已经释放了资源,这样做的好处是减少了线程从睡眠到唤醒的资源消耗,但会一直占用CPU的资源。适用于资源的锁被持有的时间短,而又不希望在线程的唤醒上花费太多资源的情况。

 

从 实现原理上来讲,互斥锁属于sleep-waiting(睡眠等待)类型的锁。例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和 Core1上。

假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持有,那么线程A就会被阻塞 (blocking),Core0 会在此时进行上下文切换(Context Switch)将线程A置于等待队列中,此时Core0就可以运行其他的任务(例如另一个线程C)而不必进行忙等待。

而自旋锁则不然,它属于busy-waiting(忙等待)类型的锁,如果线程A是使用pthread_spin_lock操作去请求锁,那么线程A就会一直在 Core0上进行忙等待并不停的进行锁请求,直到得到这个锁为止。


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++知识点小结(趁热搬砖三年半的小码农) 2020年07月2日整理 的相关文章

  • Linux下的C++后台开发知识点汇总

    计算机操作系统 xff08 Linux xff09 命令 xff1a netstat xff1a netstat命令用于显示与IP TCP UDP 和ICMP协议相关的统计数据 xff0c 一般用于检验本机各端口的网络连接情况 netsta
  • GitLab设置通知企业微信机器人

    将Gitlab的push tag push merge request和pipeline等等推送到企业微信的机器人 应用部署运行 应用通过环境变量添加机器人webhook地址 xff0c WEBHOOK URL 作为前缀 xff0c 后面可
  • leecode刷题 Longest Substring Without Repeating Characters

    1 Two Sum Given an array of integers return indices of the two numbers such that they add up to a specific target You ma
  • leetcode 刷题 三元组问题 三数之和等于0

    15 三数之和 难度中等2128收藏分享切换为英文关注反馈 给你一个包含 n 个整数的数组 nums xff0c 判断 nums 中是否存在三个元素 a xff0c b xff0c c xff0c 使得 a 43 b 43 c 61 0 x
  • Print in Order 解题报告(C++)

    我们提供了一个类 xff1a public class Foo public void one print 34 one 34 public void two print 34 two 34 public void three print
  • 算法刷题5-27 找到一个数组中出现一次的数字, 其他数字出现均为偶数次

    找到一个数组中出现一次的数字 其他数字出现均为偶数次 input 1 xff0c 1 xff0c 2 3 3 4 4 6 7 6 7 out 2 算法思路 xff1a 1 1 61 0 0 1 61 1 0 1 2 1 61 2 inclu
  • B站视频:如何成为一个架构师笔记

    架构师可能更关注的不是编程语言本身 而是一些框架 xff0c 一些设计模式 xff0c 怎么和业务更好地契合 架构师需要会nigx 如果服务器中有大量的IO那么负载会更大 xff0c 为了解决平凡读取磁盘的操作 xff0c 我们通常 xff
  • 设计模式学习笔记

    变化是复用的天敌 xff01 面向对象设计最大的优势在于 xff1a 抵御变化 重新认识面向对象 xff1a 理解格力变化 xff1a 从宏观层面来看 xff0c 面向对象的构建方式更能适应软件的变化 xff0c 能将变化所带来的影响减为最
  • leetcode刷题5/29

    面试题24 反转链表 难度简单42 定义一个函数 xff0c 输入一个链表的头节点 xff0c 反转该链表并输出反转后链表的头节点 示例 输入 1 gt 2 gt 3 gt 4 gt 5 gt NULL 输出 5 gt 4 gt 3 gt
  • 浅谈单例模式 又叫对象性能模式

    对象性能模式 面向对象很好地解决抽象的问题 xff0c 但是必不可免地要付出一些代价 xff0c 对于通常情况来讲 xff0c 面向对象的成本大都可以忽略不计 xff0c 但是某些情况 xff0c 面向对象所带来的的成本必须谨慎处理 经典模
  • 清华大学研究成果:如何用博弈论解决自动驾驶路口的会车决策问题?

    雷锋网新智驾按 xff1a 4月24日 xff0c 雷锋网新智驾联合MMC在2017年上海车展举办 构建智能驾驶的关键 主题沙龙 xff0c 本文来自清华大学自动化系统工程研究所教授姚丹亚的分享 本文讲述了V2X技术在自动驾驶中的一个重要应
  • Sonarqube集成到Jenkins实现代码自动检测

    如何使用Sonar把不同的代码检查工具结果直接显示在WEB页面上 xff1f xff1f 详细实操如下 xff1a 需要配置 Sonarqube服务端 xff1a 192 168 10 12Sonarqube客户端postgres 数据库
  • 车路协调系统图

  • c++ 两个vector之间相互赋值,或在一个后面追加另一个

    方法1 xff1a vector lt int gt v1 v2 声明 方法2 xff1a vector lt int gt v1 v1 swap v2 将两个容器内的元素交换 需要构建临时对象 xff0c 一个拷贝构造 xff0c 两次赋
  • 6月8 力扣 回文数和验证回文串

    9 回文数 难度简单1057收藏分享切换为英文关注反馈 判断一个整数是否是回文数 回文数是指正序 xff08 从左向右 xff09 和倒序 xff08 从右向左 xff09 读都是一样的整数 示例 1 输入 121 输出 true 示例 2
  • C++11 并发指南一(C++11 多线程初探)

    相信 Linux 程序员都用过 Pthread 但有了 C 43 43 11 的 std thread 以后 xff0c 你可以在语言层面编写多线程程序了 xff0c 直接的好处就是多线程程序的可移植性得到了很大的提高 xff0c 所以作为
  • 二分搜索binary search和贪婪算法

    二分搜索binary search 定义 xff1a 二分搜索也称折半搜索 xff0c 是一种在有序数组中查找某一特定元素的搜索算法 运用前提 xff1a 必须是排好序的 输入并不一定是数组 xff0c 也可能是给定一个区间和终止的位置 优
  • 面试题52. 两个链表的第一个公共节点

    面试题52 两个链表的第一个公共节点 难度简单51收藏分享切换为英文关注反馈 输入两个链表 xff0c 找出它们的第一个公共节点 如下面的两个链表 xff1a 在节点 c1 开始相交 示例 1 xff1a 输入 xff1a intersec
  • 求解两个字符串的最长公共子序列

    一 xff0c 问题描述 给定两个字符串 xff0c 求解这两个字符串的最长公共子序列 xff08 Longest Common Sequence xff09 比如字符串1 xff1a BDCABA xff1b 字符串2 xff1a ABC
  • leetcode刷题6.16 树的层序遍历,树的序列化

    给你一个二叉树 xff0c 请你返回其按 层序遍历 得到的节点值 xff08 即逐层地 xff0c 从左到右访问所有节点 xff09 示例 xff1a 二叉树 xff1a 3 9 20 null null 15 7 3 9 20 15 7

随机推荐

  • 深度优先及广度优先算法

    深度优先搜索算法DFS 广度优先搜索算法BFS 在猪呢个算法知识点中占比非常大 xff0c 应用最多的地方是对图进行遍历 xff08 树以为是图的一种 xff09 深度优先搜索算法DFS DFS解决的 是连通性的问题 xff0c 及给定两个
  • 厄拉多塞筛法 快速求质数 /回文子串

    西元前250年 xff0c 希腊数学家厄拉多塞 Eeatosthese 想到了一个非常美妙的质数筛法 xff0c 减少了逐一检查每个数的的步骤 xff0c 可以比较简单的从一大堆数字之中 xff0c 筛选出质数来 xff0c 这方法被称作厄
  • Docker部署Sonarqube

    1 下载镜像 docker pull registry span class token punctuation span cn span class token operator span shenzhen span class toke
  • leetcode刷题 旋转链表

    92 反转链表 II 难度中等393 反转从位置 m 到 n 的链表 请使用一趟扫描完成反转 说明 1 m n 链表长度 示例 输入 1 gt 2 gt 3 gt 4 gt 5 gt NULL m 61 2 n 61 4 输出 1 gt 4
  • 分布式实时处理系统——C++高性能编程 RAII resource acquisition is initialization

    分布式实时处理系统 C 43 43 高性能编程 前言 基于通信基础 xff0c 介绍Hurricane实时处理系统的工程实现 xff0c 主要使用C 43 43 语言 一 IPC socket 异步I O epoll 二 C 43 43 1
  • 6月21 刷题思考

    1 RALL相关知识点 2 std set的使用 xff1f xff1f 不熟练 3 一个无序整数数组中找到最长连续序列 4 Two Sum 问题 Data structure design 5 i 43 43 在两个线程里边分别执行100
  • V2X就是Vehicle To Everything 国标中有五种消息BSM、RSI、RSM、SPAT、MAP

    前面讲到V2X就是Vehicle To Everything xff0c 即车队外界所有信息的交换 xff0c 这里的X代表Everything xff0c 在V2X概念中 xff0c 我们将它看作四大部分 xff0c 车与车通信 xff0
  • 6月23 leetcode 二进制求和

    67 二进制求和 难度简单404收藏分享切换为英文关注反馈 给你两个二进制字符串 xff0c 返回它们的和 xff08 用二进制表示 xff09 输入为 非空 字符串且只包含数字 1 和 0 示例 1 输入 a 61 34 11 34 b
  • 利用栈实现树的中序遍历

    94 二叉树的中序遍历 难度中等537收藏分享切换为英文关注反馈 给定一个二叉树 xff0c 返回它的中序 遍历 示例 输入 1 null 2 3 1 2 3 输出 1 3 2 进阶 递归算法很简单 xff0c 你可以通过迭代算法完成吗 x
  • STL中的set详解

    1 关于set C 43 43 STL 之所以得到广泛的赞誉 xff0c 也被很多人使用 xff0c 不只是提供了像vector string list等方便的容器 xff0c 更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构
  • 你真的了解二分查找吗?

    传统的二分查找算法 提到二分查找 xff0c 相信很多人都不陌生 xff0c 大学学数据结构的时候老师都讲过 xff0c 它是一种效率较高的查找方法 xff0c 基于顺序存储结构的线性表 xff0c 且要求表中元素按关键字有序排列 假设元素
  • 二叉树DFS/BFS实现(C++)

    深度优先搜索算法 xff08 Depth First Search xff09 DFS是搜索算法的一种 它沿着树的深度遍历树的节点 xff0c 尽可能深的搜索树的分支 当节点v的所有边都己被探寻过 xff0c 搜索将回溯到发现节点v的那条边
  • 当TCP建立连接过程中出现问题了,如何检查?

    netstat命令 stat状态说明 TCP协议规定 xff0c 对于已经建立的连接 xff0c 网络双方要进行四次握手才能成功断开连接 xff0c 如果缺少了其中某个步骤 xff0c 将会使连接处于假死状态 xff0c 连接本身占用的资源
  • 本地服务器上传代码到gitee仓库

    把gitlab仓库里的node day01项目传到本地服务器 再把本地服务器里的node day01项目传到Gitee代码仓库 1 登录Gitlab xff0c 复制代码仓库地址 2 拷贝一刚复制的Git 仓库到本地 root 64 ubu
  • 牛客网刷刷刷刷

    作者 xff1a 故事的小黄瓜 链接 xff1a https www nowcoder com discuss 436386 来源 xff1a 牛客网 1 xff0e 线程池如何开启一个新线程 xff1f 2 xff0e 线程池初始化的步骤
  • c++ 后端linux开发常见问题

    计算机操作系统 xff08 Linux xff09 命令 xff1a netstat tcpdump ipcs ipcrm 这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验 cpu 内存 硬盘 等等与系统性能调试相关的命令必须熟
  • STL c++ 使用小结

    各位看官 xff0c 欢迎来到趁热搬砖小码农的博客 在写C 43 43 程序的时候会发现STL是一个不错的东西 xff0c 减少了代码量 xff0c 使代码的复用率大大提高 xff0c 减轻了程序猿的负担 还有一个就是容器 xff0c 你会
  • Oracle面试题,带答案!

    1 你要对操纵Oracle数据库中的数据 下列哪个选项表示Oracle中select语句的功能 xff0c 并且不需要使用子查询 xff08 C xff09 A xff0e 可以用select语句改变Oracle中的数据 B xff0e 可
  • 什么是进程?什么是线程?总结

    1 什么是进程 xff1f 什么是线程 xff1f 进程是表示资源分配的基本单位 xff0c 又是调度运行的基本单位 例如 xff0c 用户运行自己的程序 xff0c 系统就创建一个进程 xff0c 并为它分配资源 xff0c 包括各种表格
  • C++知识点小结(趁热搬砖三年半的小码农) 2020年07月2日整理

    c 43 43 最好用易用的新特性 xff1a auto decltype https blog csdn net zyc2018 article details 93591189nullptr range forusing c 43 43