C/C++ 个人笔记

仅供个人复习,

C语言IO占位符表

%d十进制整数(int)
%ldlong
%lldlong long
%uunsigned int
%o八进制整型
%x十六进制整数/字符串地址
%c单个字符
%s字符串
%ffloat,默认保留6位
%lfdouble
%e科学计数法
%g根据大小自动选取f或e格式,去掉无效0

转义符表

转义符可以取消关键字符的特殊性,下面是常见的转义符使搭配

	printf("\b");//退格符printf("\n");//换行printf("\a");//响铃,电脑真的响一下,不可思议printf("\t");//水平制表符printf("\v");//垂直制表符printf("\130");//输出char对应130的字符printf("%% %d",12);//%的转义使用%,而不是\

C/C++ 语言数据类型大小

ANSI/ISO规范

sizeof(short int)<=sizeof(int)
sizeof(int)<=sizeof(long int) short
int至少应为16位(2字节)
long int至少应为32位。

16位编译器

数据类型字节数
char1
short2
int2
long4
float4
double8
bool1
指针2

32位编译器

数据类型字节数
char1
short2
int4
long4
long long8
float4
double8
bool1
long double12
指针4

64位编译器

数据类型字节数
char1
short2
int4
long8
long long8
float4
double8
bool1
long double16
指针8

宏函数和内联函数的区别

宏函数(Macro Functions):

  1. 替换规则:在编译预处理阶段的简单文本替换

  2. 参数展开:没有参数类型检查

  3. 适用场景:简单的、短小的代码片段,例如进行简单的数学计算、位操作等。

内联函数(Inline Functions):

  1. 替换规则:编译阶段处理。编译器会尝试将函数调用处直接替换为函数体。

  2. 参数类型检查:参数和返回值检查与正常函数无异

  3. 适用场景:内联函数适用于较短小的函数,包含一些简单的代码逻辑,且频繁调用的情况。

  4. 推荐用法:一般来说,内联函数应该是在类的定义中实现的,以便于对其进行封装和管理,或者在头文件中避免函数重定义问题。inline关键字只能建议编译器进行内联,是否采纳取决于编译器

内联函数可以优化函数进入和离开的开销,但内联可能会导致编译后的代码体积增大,宏函数的使用更需要小心,因为它在文本替换阶段可能会引发一些意想不到的问题。

差异案例

#include <iostream>#define SQUARE_MACRO(x) x * xinline int square_inline(int x) {return x * x;
}int main() {int num = 5;// result = (++num) * (++num)   直接把参数替换进函数int result_macro = SQUARE_MACRO(++num); // 使用宏函数num = 5;//先自增再传入int result_inline = square_inline(++num); // 使用内联函数std::cout << "Number: " << num << std::endl;std::cout << "Result (Macro): " << result_macro << std::endl;std::cout << "Result (Inline): " << result_inline << std::endl;return 0;
}

在这里插入图片描述

STL标准库

vector

优点:

  • 内存是连续分配的,访问元素的速度较快。
  • 在末尾插入和删除元素的时间复杂度为常数。

缺点:

  • 在中间插入或删除元素的时间复杂度较高,需要移动后续元素。
  • 在内存不足时,可能会导致重新分配内存和复制元素。
#include <vector>std::vector<int> v;v.push_back(10); // 在末尾插入元素
v.pop_back();    // 删除末尾的元素
v.size();        // 返回容器中的元素数量
v.empty();       // 检查容器是否为空
v.clear();       // 清空容器中的所有元素
v.at(index);     // 访问指定索引的元素
v.front();       // 访问首元素
v.back();        // 访问末尾元素
v.begin();       // 返回指向容器第一个元素的迭代器
v.end();         // 返回指向容器最后一个元素之后的迭代器

list

优点:

  • 支持在任意位置快速插入和删除元素。
  • 在中间插入和删除元素的时间复杂度为常数。

缺点:

  • 元素在内存中不连续存储,访问元素的速度慢。
  • 占用更多内存,每个节点需要存储额外的指针。
#include <list>std::list<int> lst;lst.push_back(10); // 在末尾插入元素
lst.push_front(20); // 在开头插入元素
lst.pop_back();     // 删除末尾的元素
lst.pop_front();    // 删除开头的元素
lst.size();         // 返回容器中的元素数量
lst.empty();        // 检查容器是否为空
lst.clear();        // 清空容器中的所有元素
lst.front();        // 访问首元素
lst.back();         // 访问末尾元素
lst.begin();        // 返回指向容器第一个元素的迭代器
lst.end();          // 返回指向容器最后一个元素之后的迭代器

forawrd_list

与list类似,仅支持单向访问,效率更佳一些

#include <forward_list>
std::forward_list<T> fl;fl.push_front(const value_type& value); // 在头部插入元素
fl.pop_front(); // 从头部删除元素
fl.insert_after(pos, const value_type& value); // 在指定位置后插入元素
fl.erase_after(pos); // 在指定位置后删除元素
fl.front(); // 访问第一个元素
fl.begin(); // 返回指向第一个元素的迭代器
fl.end(); // 返回指向最后一个元素之后的迭代器

deque

优点:

  • 支持在两端快速插入和删除元素。
  • 内存是分块分配的,访问元素的速度较快。

缺点:

  • 难以在中间插入或删除元素
  • 存储多个分块,占用较多内存
#include <deque>std::deque<int> dq;dq.push_back(10); // 在末尾插入元素
dq.push_front(20); // 在开头插入元素
dq.pop_back();     // 删除末尾的元素
dq.pop_front();    // 删除开头的元素
dq.size();         // 返回容器中的元素数量
dq.empty();        // 检查容器是否为空
dq.clear();        // 清空容器中的所有元素
dq.front();        // 访问首元素
dq.back();         // 访问末尾元素
dq.begin();        // 返回指向容器第一个元素的迭代器
dq.end();          // 返回指向容器最后一个元素之后的迭代器

map

优点:

  • 存储键值对,支持按键进行高效的查找和插入。
  • 根据键的顺序遍历元素。

缺点:

  • 内存使用较多,每个键值对都需要额外的内存存储键。
  • 没有连续存储,访问元素的速度相对较慢。
#include <map>std::map<std::string, int> m;m["one"] = 1; // 插入键值对
m["two"] = 2;
m.find(const key_type& k); // 查找键的位置
m.count(const key_type& k); // 计算具有特定键的元素数量
m.size(); // 返回容器中的键值对数量
m.empty(); // 检查容器是否为空
m.clear(); // 清空容器中的所有键值对
m.begin(); // 返回指向容器第一个键值对的迭代器
m.end(); // 返回指向容器最后一个键值对之后的迭代器

set

优点:

  • 存储唯一的元素,支持按值进行高效的查找和插入。

缺点:

  • 内存使用较多,每个元素都需要额外的内存存储。
  • 不连续存储,访问元素的速度相对较慢。
#include <set>std::set<int> s;s.insert(const value_type& val); // 插入元素
s.find(const key_type& k); // 查找元素
s.size(); // 返回容器中的元素数量
s.empty(); // 检查容器是否为空
s.clear(); // 清空容器中的所有元素
s.begin(); // 返回指向容器第一个元素的迭代器
s.end(); // 返回指向容器最后一个元素之后的迭代器

unordered_map (C++11)

优点:

  • 使用哈希表实现,支持快速的查找和插入操作,平均时间复杂度为常数。
  • 对于大数据集,查找效率高于std::map。

缺点:

  • 内存占用较高,需要存储哈希表和键值对。
  • 不保证元素的顺序。
#include <unordered_map>std::unordered_map<std::string, int> um;um["one"] = 1; // 插入键值对
um["two"] = 2;
um.find(const key_type& k); // 查找键的位置
um.count(const key_type& k); // 计算具有特定键的元素数量
um.size(); // 返回容器中的键值对数量
um.empty(); // 检查容器是否为空
um.clear(); // 清空容器中的所有键值对
um.begin(); // 返回指向容器第一个键值对的迭代器
um.end(); // 返回指向容器最后一个键值对之后的迭代器

unordered_set (C++11)

优点:

  • 使用哈希表进行实现,支持快速的查找和插入操作,平均时间复杂度为常数。
  • 对于大数据集,查找效率高于std::set。

缺点:

  • 内存占用较高,因为需要存储哈希表和元素。
  • 不保证元素的顺序。
#include <unordered_set>std::unordered_set<int> us;us.insert(const value_type& val); // 插入元素
us.find(const key_type& k); // 查找元素
us.size(); // 返回容器中的元素数量
us.empty(); // 检查容器是否为空
us.clear(); // 清空容器中的所有元素
us.begin(); // 返回指向容器第一个元素的迭代器
us.end(); // 返回指向容器最后一个元素之后的迭代器

stack

#include <stack>std::stack<T> s;s.push(const value_type& value); // 将元素压入堆栈顶部
s.pop(); // 弹出堆栈顶部的元素
s.top(); // 访问堆栈顶部的元素
s.empty(); // 检查堆栈是否为空
s.size(); // 返回堆栈中元素的数量

queue

#include <queue>std::queue<T> q;q.push(const value_type& value); // 将元素推入队列尾部
q.pop(); // 从队列头部弹出元素
q.front(); // 访问队列头部元素
q.back(); // 访问队列尾部元素
q.empty(); // 检查队列是否为空
q.size(); // 返回队列中元素的数量

priority_queue

#include <queue>std::priority_queue<T> pq;pq.push(const value_type& value); // 将元素推入优先队列
pq.pop(); // 从优先队列中弹出元素
pq.top(); // 访问优先队列中优先级最高的元素
pq.empty(); // 检查优先队列是否为空
pq.size(); // 返回优先队列中元素的数量
#include <iostream>
#include <queue>
#include <vector>struct MyStruct {int value;// 比较操作符,根据 value 来比较 ,越大优先级越高bool operator<(const MyStruct& other) const {return value < other.value;}
};int main() {std::priority_queue<MyStruct> pq;pq.push({5});pq.push({2});pq.push({8});pq.push({1});// 遍历优先队列按优先级输出while (!pq.empty()) {std::cout << pq.top().value << " ";pq.pop();}return 0;
}
// 8 5 2 1

构造函数执行顺序

  • 先成员的构造,再当前类型的构造
  • 父类构造优先于子类构造
  • 成员初始化按书写顺序,低于构造顺序
  • 虚基类只构造一次,非虚构造两次

例题:问输出结果是多少

#include <iostream>class A {
public:A() {std::cout << "A Constructor" << std::endl;}
};class B : public A {
public:B() {std::cout << "B Constructor" << std::endl;}
};class C : public A {
public:C() {std::cout << "C Constructor" << std::endl;}
};class D : public B, public C {
public:D() {std::cout << "D Constructor" << std::endl;}
};int main() {D d;return 0;
}

在这里插入图片描述

智能指针

  • std::shared_ptr:允许多个智能指针共享同一个对象,通过引用计数来管理对象的生命周期。当最后一个引用被释放时,对象会被销毁。
auto sp = std::make_shared<int>(); // 分配堆空间,创建智能指针
auto sp2 = sp; // 创建另一个智能指针 
  • std::unique_ptr:用于独占地拥有一个对象,不能被多个智能指针共享。它提供了更轻量级的智能指针,适用于不需要共享所有权的情况。

  • std::weak_ptr:用于解决std::shared_ptr的循环引用问题。它可以与std::shared_ptr一起使用,但不会增加对象的引用计数。

今天到这里,改日再更

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

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

相关文章

从零开发HarmonyOS(鸿蒙)手机小游戏——数字华容道

HarmonyOS&#xff08;鸿蒙&#xff09;手机第一个小游戏app——数字华容道 前言概述正文创建项目实现初始界面布局实现数字的随机打乱实现滑动或点击调换数字实现游戏成功界面 源代码结语 前言 2月16号HarmonyOS2.0手机开发者Beta版已经发布了&#xff0c;作为“18N”战略的重…

【180929】败走华容道游戏源码

这是一款基于WPF非常经典的华容道游戏源码。 古老的中国游戏&#xff0c;以其变化多端、百玩不厌的特点与魔方、独立钻石棋一起被国外智力专家并称 为“智力游戏界的三个不可思议”。它与七巧板、九连环等中国传统益智玩具还有个代名词叫作“中国的难题”。 游戏玩法&#xff1…

华容道小游戏

华容道代码&#xff1a; package ytu.jsj.com.cn; import java.awt.*; import java.awt.event.*; import javax.swing.*;public class Hua_Rong_Road extends JFrame implements MouseListener,KeyListener,ActionListener{Person person[]new Person[10];JButton left,right,a…

【180927】华容道游戏源码

本源码是一个采用winform进行开发的华容道游戏源码&#xff0c;华容道游戏作为一个经典游戏&#xff0c;各部分设计都恰到好处&#xff0c;非常巧妙&#xff0c;因此成为世界游戏界的三大不可思议。华容道游戏源于三国时期著名的历史故事。东汉末年&#xff0c;曹操、孙权以及刘…

28连局华容道游戏

华容道游戏取材于三国时期,关羽在华容道放走曹操的故事。这个游戏一共28局,是根据一款手机游戏编写的,希望大家能够喜欢。一个益智类的小游戏,大家可以在工作之余作为消遣之乐。 玩不过去没有关系,我们可以把游戏进度存储起来,下次玩的时候读取进度文件就可以了,我们可以…

华容道游戏VB.NET 2010 版28连局

这一版的华容道游戏,有玩法演示,局数、步数、时间提示完善。新增加了关数名字。 托动处理的更加完美,当鼠标手动图片后图片消失,鼠标变成你托动的图片,产生一种立体的感觉。 请大家查看新版的华容道游戏VB.NET 2010 版28连局。 下载地址:http://blog.sina.com.cn/…

经典华容道游戏(含bfs求解)

前言 这是数据结构的课设作业&#xff0c;也是我第一次写的千行代码小游戏。 学习EasyX图形库写完程序一共用了三天时间&#xff0c;可以说是相当熬人了。 当然&#xff0c;第一次写&#xff0c;难免不怎么好&#xff0c;比如无动画、无音乐、丑得不行的ui等等&#xff0c;体…

206. 反转链表 (简单系列)

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&#xff1a; 输…

DebugInfo 模块功能系统介绍 文本上色 文本与表格对齐 分隔线 秒表计算器 语义日期

背景 今天系统性的为大家介绍一下 DebugInfo 模块。这个模块提供了一些丰富的基本功能的封装&#xff0c;希望能给有需要的人带来些许帮助。 文本上色 DebugInfo 模块引入了 colorama提供文本颜色支持。 # -*- coding:UTF-8 -*-# region 引入必要依赖 from DebugInfo.DebugI…

数字时钟器

数字时钟器 一、实现功能&#xff1a; 实现基本的时钟样式实现时间日期的文本显示实现仿真秒针走动时候的音效支持设置时间&#xff0c;点击时钟中间设置时间&#xff0c;点击边缘恢复系统时间。 二、效果截屏&#xff1a; 三、github源码地址 GitHub - LxNoMi/DigitalClock…

FPGA数字时钟

FPGA数字时钟1 本代码借鉴了一些&#xff0c;网上资源。 1.设计目的 &#xff08;1&#xff09;掌握数字电子钟的设计方法&#xff1b; &#xff08;2&#xff09;掌握常用数字集成电路的功能和使用&#xff1b; &#xff08;3&#xff09;巩固数字电路理论知识&#xff0c;掌握…

HSP高度敏感的人应该了解的内容(附图书资源)

推荐图书:《高敏感是种天赋》 在爆炸的信息海中希望你慢慢看&#xff0c;细细品~ 什么是高敏感人群&#xff1f; &#xff08;Highly Sensitive Person&#xff0c;简称HSP&#xff09;是指那些对外界刺激和情绪变化非常敏感&#xff0c;容易受到情绪的影响&#xff0c;并且需…

基于Arduino的多功能数字时钟

实现功能&#xff1a; 显示时间、日期和星期断电保存时间通过按钮设置时间、日期整点响铃自定义闹钟显示温度自定义报警温度按键功能&#xff1a;按选择键进入设置时间功能&#xff1b;同时按 - 键进入闹钟和报警温度设置功能&#xff1b;再按选择键光标跳动&#xff0c;光标…

【Proteus】多功能数字时钟设计

ZQQQ 2021.12.27 课设一:各芯片引脚介绍:1:数码管:[^1]2:CD4511(译码显示):[^2]3:CD4518(计数器)[^3]3:555定时器4:CD4011和CD4012 二:各部分电路图搭建1:校正时间电路2:整点报时电路3:分频电路4:进制电路 课设 我们将该电路分为几个部分: 1:显示电路(用6个共阴数码管来显示) 2…

单片机:数字式时钟—日历

单片机&#xff1a;数字式时钟—日历 功能要求&#xff1a; &#xff08;1&#xff09;显示时分秒&#xff0c;年月日 &#xff08;2&#xff09;具有&#xff1a;启动&#xff08;按下此键后单片机才开始工作&#xff09;、暂停、继续、清零、设置时间/年月日/闹钟的功能 &am…

Quartus ii 13.1 数字时钟

内容摘要&#xff1a; 使用计数器和数据选择器等器件实现数字时钟电路。电路最终在开发板上显示的是时钟的秒和分&#xff08;开发板所限&#xff0c;当然如果开发板支持8位显示的话也可以自己加到小时位的显示&#xff09;。电路包四个部分&#xff1a;时钟信号分频电路&#…

FPGA-Verilog多功能数字时钟

一&#xff0e;数字时钟设计 1.硬件资源&#xff1a;共阴极数码管一块&#xff0c;FPGA开发板一块&#xff08;EP4CE40F23C8&#xff09;&#xff1b; 2. 开发板资源&#xff1a;3颗独立按键&#xff0c;数码管接口&#xff1b; 3. 功能设计&#xff1a;三种功能&#xff1a…

【Java】Java数字时钟

应用名称&#xff1a;Java数字时钟 用到的知识&#xff1a;Java GUI编程&#xff0c;线程 开发环境&#xff1a;win8eclipsejdk1.8 功能说明&#xff1a;可以显示当前系统的年月日、星期以及准确时间&#xff0c;并实时更新显示。 效果图&#xff1a; 源代码&#xff1a; i…

51单片机入门——(新)简易数字时钟

文章目录 设计要求原理图按键部分介绍 代码解析 设计要求 实现正确稳定地显示小时(两位数)、分钟(两位数)、秒钟(两位数)&#xff0c;同时数码管应无闪烁问题。通过按键分别实现时、分信息的调整&#xff0c;方便用户对时间的校准。加入闹铃功能在&#xff08;本设计中用LED代…

基于FPGA的数字时钟verilog开发

目录 一、理论基础 二、案例背景 1.问题描述 2.思路流程 三、verilog核心仿真 四、仿真结论分析 五、参考文献 一、理论基础 整个程序分为以下三大部分&#xff1a; 时钟控制部分&#xff0c;分为调整分&#xff0c;秒功能&#xff0c;秒清零功能&#xff1b; 暂停功…