c++学习第十三
1)循环引用的案例及解决办法:
#include <iostream>
#include <memory>
using namespace std;
class A;class B
{
public:B(){cout<<"B constructor---"<<endl;}~B(){cout<<"B deconstructor----"<<endl;}std::weak_ptr<A> pA; //如果是std::shared_ptr,则会造成引用计数永远无法归0,资源不会被释放;
};class A
{
public:A(){cout<<"A constructor---------"<<endl;}~A(){cout<<"A deconstructor----------------"<<endl;}std::shared_ptr<B> pB;
};int main()
{std::shared_ptr<A> pAA = make_shared<A>();std::shared_ptr<B> pBB = make_shared<B>();pAA->pB = pBB;pBB->pA = pAA;return 0;
}
2)emplace紧调用一次构造函数,push_back调用一次构造,一次拷贝,测试代码如下:
所以:优先使用emplace成员函数。
#include<iostream>
#include<vector>
#include<algorithm>
#include<set>using namespace std;struct SBook
{
public:SBook() : bookName(""), price(0){std::cout << "default construct: " << bookName << std::endl;}SBook(std::string bookName_, int price_) : bookName(bookName_), price(price_){std::cout << "construct: " << bookName << std::endl;};SBook(const SBook& rhs) : bookName(rhs.bookName), price(rhs.price){std::cout << "copy construct: " << bookName << std::endl;}~SBook(){std::cout << "deconstruct: " << bookName << std::endl;}bool operator <(const SBook& rhs) const{return bookName < rhs.bookName;}public:std::string bookName;int price;
};int main(int argc, char *argv[])
{// 测试vectorvector<SBook> books;// 预先分配,否则整个vector在容量不够的情况下重新分配内存books.reserve(100);std::cout << "test push_back:" << endl;books.push_back(SBook("C++从入门到放弃", 1));std::cout << endl;std::cout << "test emplace_back:" << endl;books.emplace_back("水浒传", 2);std::cout << endl;std::cout << "test emplace_back default:" << endl;books.emplace_back();auto& book = books.back();book.bookName = "红楼梦";book.price = 5;std::cout << endl;std::cout << "test emplace:" << endl;auto it = books.emplace(books.end());it->bookName = "西游记";it->price = 3;std::cout << endl;std::cout << "output all books: " << endl;for_each(books.begin(), books.end(), [](const SBook& book)->void{std::cout << book.bookName << endl;});std::cout << endl;// 测试setset<SBook> bookSet;std::cout << "test bookSet insert:" << endl;bookSet.insert(SBook("十万个为什么", 1));std::cout << endl;std::cout << "test bookSet emplace:" << endl;bookSet.emplace("新华字典", 2);std::cout << endl;std::cout << "output bookset: " << endl;for_each(bookSet.begin(), bookSet.end(), [](const SBook&book)->void{std::cout << book.bookName << endl;});std::cout << endl;return 0 ;
}
3)unordered_map的使用
#include <iostream>
#include <unordered_map>
using namespace std;template<class K,class V>
using umap = std::unordered_map<K,V>;int main(void)
{umap<string,string> m{{"111","bbb"},{"222","ddd"}};cout<<m["111"]<<endl; //显示key为"111"的value;return 0;
}
4)利用模板类的参数,自动生成友元函数;
芙蓉楼送辛渐
王昌龄
寒雨连江夜入吴,
平明送客楚山孤。
洛阳亲友如相问,
一片冰心在玉壶;
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。template<class T1, class T2>
class AA
{T1 m_x;T2 m_y;
public:AA(const T1 x, const T2 y) : m_x(x), m_y(y) { }// 非模板友元:友元函数不是模板函数,而是利用模板类参数生成的函数,只能在类内实现。// 本质:编译器利用模板参数,帮我们生成了一个友元函数,但是这个函数不是模板函数friend void show(const AA<T1, T2>& a){cout << "x = " << a.m_x << ", y = " << a.m_y << endl;}
};int main(void)
{AA<int,string> a(44,"abcde");show(a);return 0;
}
5)模板类与函数的组合使用(包括:普通函数,函数模板特化版本,函数模板泛化版本)
模板类可以用于函数的参数和返回值!
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。template<class T1, class T2>
class AA // 模板类AA。
{
public:T1 m_x;T2 m_y;AA(const T1 x, const T2 y) : m_x(x), m_y(y) { }void show() const { cout << "show() x = " << m_x << ", y = " << m_y << endl; }
};// 采用普通函数,参数和返回值是模板类AA的实例化版本。
AA<int, string> func(AA<int, string>& aa)
{aa.show();cout << "调用了func(AA<int, string> &aa)普通函数。\n";return aa;
}// 函数模板,参数和返回值是的模板类AA。
template <typename T1,typename T2>
AA<T1, T2> func(AA<T1, T2>& aa)
{aa.show();cout << "调用了func(AA<T1, T2> &aa)特化函数。\n";return aa;
}// 函数模板,参数和返回值是任意类型。
template <typename T>
T func(T &aa)
{aa.show();cout << "调用了func(AA<T> &aa)任意类型泛化函数。\n";return aa;
}int main()
{AA<int, string> aa1(3, "我是一只傻傻鸟。"); //以上三个函数,优先调用普通函数,再次调用特化版本,最后是泛化版本!func(aa1);AA<double,string> aa2(3.4,"5555"); //特化版本func(aa2);
}
6)模板类继承普通类范例:
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。
class aa
{
public:int a_;aa(int a) :a_(a) { cout << "调用了AA的构造函数。\n"; }void func1() { cout << "调用了func1()函数:m_a=" << a_ << endl;; }};template<class T1,class T2>
class bb : public aa
{
public:T1 x_;T2 y_; bb(T1 x,T2 y,int a): aa(a),x_(x),y_(y){ cout << "调用了BB的构造函数"<<endl;}void func2() const { cout << "调用了func2()函数:x = " << x_ << ", y = " << y_ << endl; }
};int main(void)
{bb<int, string> bb(8, "我是一只傻傻鸟。",3);bb.func2();bb.func1(); return 0;
}
学习知识tips:
引用是指针常量的伪装
构造函数一般有两个执行阶段:初始化阶段和赋值阶段;
成员指针运算符 .* 或者 ->* c++特有的
std::is_same //类型萃取相关的函数
integral 美 [ˈɪntɪɡrəl] adj 完整的,n积分
typeid跟sizeof用法意义,有两种写法 typeid(int);
typeid(变量名或者表达式);
7)匿名共用体一般是写在结构体中的
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。struct st_girl // 定义超女结构体。
{int no; // 超女编号。union // 定义匿名共同体udata。{int a;double b;char c[21];};
};int main()
{st_girl girl;cout<<sizeof(girl)<<endl; //输出是32 = 4 + 4 + 24; 空的union占1个字节;那为什么4个呢,因为得字节对齐return 0;
}
8)共用体使用方法:
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。union udata // 定义共同体udata。
{int a;double b;char c[21];
};int main()
{udata data;cout << "sizeof(data)="<< sizeof(data) << endl;cout << "data.a的地址是:" << (void*) & data.a << endl; //输出地址相同cout << "data.b的地址是:" << (void*) & data.b << endl;//输出地址相同cout << "data.c的地址是:" << (void*) & data.c << endl;//输出地址相同data.b = 30; cout << "data.a=" << data.a << endl;cout << "data.b=" << data.b << endl;cout << "data.c=" << data.c << endl;
}
输出结果:
sizeof(data)=24
data.a的地址是:0x7ffd02aa4860
data.b的地址是:0x7ffd02aa4860
data.c的地址是:0x7ffd02aa4860
data.a=0
data.b=30
data.c=
相关文章:
c++学习第十三
1)循环引用的案例及解决办法: #include <iostream> #include <memory> using namespace std; class A;class B { public:B(){cout<<"B constructor---"<<endl;}~B(){cout<<"B deconstructor----"<<endl;}std::weak_…...
java复习-线程的同步和死锁
线程的同步和死锁 同步问题引出 当多个线程访问同一资源时,会出现不同步问题。比如当票贩子A(线程A)已经通过了“判断”,但由于网络延迟,暂未修改票数的间隔时间内,票贩子B(线程B)…...
Qt指示器设置
目录 1. 样式设置 2. 行为设置 3. 交互设置 创建一个进度指示器控件 在Qt中设置指示器(Indicator)的外观和行为通常需要操作相关部件的属性和样式表。以下是如何在Qt中设置指示器的一些常见方式: 1. 样式设置 你可以使用样式表…...
计算机网络第四节 数据链路层
一,引入数据链路层的目的 1.目的意义 数据链路层是体系结构中的第二层; 从发送端来讲,物理层可以将数据链路层交付下来的数据,装换成光,电信号发送到传输介质上了 从接收端来讲,物理层能将传输介质的光&…...
Vue.js not detected解决方法
扩展程序》管理扩展程序》详情》允许访问文件地址打开...
Window10安装PHP7.4
1. 下载PHP 7 首先需要下载PHP 7的安装包,可以从PHP官网(https://www.php.net/downloads.php)或者Windows下的PHP官网(http://windows.php.net/download/)下载Windows版本的PHP 7安装包。根据自己的系统架构ÿ…...
【C++刷题】二叉树进阶刷题
根据二叉树创建字符串 class Solution { public:/** ()的省略有两种情况* 1.左右都为空,省略* 2.左子树不为空,右子树为空,省略*/string tree2str(TreeNode* root){string s;if(root nullptr){return s;}s to_string(root->val);if(root…...
有效的数独
有效的数独 题目: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。示例 1: 输…...
Vue导航守卫beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave
Vue导航守卫以我自己的理解就是监听页面进入,修改,和离开的功能。每个守卫接受三个参数 to: Route: 即将要进入的目标路由对象 from: Route: 当前导航正要离开的路由 next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。 next(): 进行…...
小红书《乡村振兴战略下传统村落文化旅游设计》中南大许少辉八一新著
小红书《乡村振兴战略下传统村落文化旅游设计》中南大许少辉八一新著...
Android13 下拉菜单栏中添加快捷截图按钮
Android 13 原生系统下拉状态栏中是没有快捷截图按钮,现在需要添加快捷截图功能。 添加快捷截图功能后的效果图: 涉及修改的文件如下: modified: vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml modified: vendor/mediatek/proprietary/…...
GFS文件系统
GFS 分布式文件系统 GlusterFS简介 GlusterFS 是一个开源的分布式文件系统。 由存储服务器、客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。 没有元数据服务器组件,这有助于提升整个系统的性能、可靠性和稳定性。 …...
22 相交链表
相交链表 题解1 快慢双指针改进 (acb bca)题解2 哈希表(偷懒) 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 题目数据 保证 整个链式结构中不存在环。 注意ÿ…...
简历(快速上手)
简历 文章目录 简历简历模板:排版上:内容上:沟通上: 简历在面试中起到关键作用 网申,HR只会花10秒多来看一下 内推,如果简历没优势就只能pass 简历模板: ⽊及简历(推荐! ) : https://resume.mdedit.online 排版上: 尽量简洁,…...
wpf复制xaml及其cs窗体到其他项目 添加现有项,选 .xaml.cs,点添加即可。VS2022
添加现有项,选 LoadingWindow.xaml.cs,点添加即可。...
在线旅游平台步入新时代,携程如何走出自己的路?
今年旅游从线下到线上全方位火了。有统计数据,一季度,光是抖音,旅游达人发布视频数量就高达175万条,播放量1350亿次,收获27亿次点赞。在这一趋势下,许多“不出名”的景区和酒店借势抖音达人完成“出圈”。短…...
java中feign远程调用底层是用Hystrix作为熔断器吗?
在较新的版本中,Feign 默认使用 OpenFeign 作为远程调用的底层实现,并且集成了 Netflix Hystrix 作为熔断器。然而,需要注意的是,自 Feign 10.x 版本开始,默认已不再集成 Hystrix。 在 Feign 中,Hystrix 被…...
Web安全——穷举爆破下篇(仅供学习)
Web安全 一、常见的端口服务穷举1、hydra 密码穷举工具的使用2、使用 hydra 穷举 ssh 服务3、使用 hydra 穷举 ftp 服务4、使用 hydra 穷举 mysql 服务5、使用 hydra 穷举 smb 服务6、使用 hydra 穷举 http 服务7、使用 hydra 穷举 pop3 服务8、使用 hydra 穷举 rdp 服务9、使用…...
强大的JTAG边界扫描(5):FPGA边界扫描应用
文章目录 1. 获取芯片的BSDL文件2. 硬件连接3. 边界扫描测试4. 总结 上一篇文章,介绍了基于STM32F103的JTAG边界扫描应用,演示了TopJTAG Probe软件的应用,以及边界扫描的基本功能。本文介绍基于Xilinx FPGA的边界扫描应用,两者几乎…...
苍穹外卖集成 Apache POI Java实现Excel文件的读写下载
苍穹外卖 day12 Echats 营业台数据可视化整合_软工菜鸡的博客-CSDN博客 Apache POI - the Java API for Microsoft Documents Project News 16 September 2022 - POI 5.2.3 available The Apache POI team is pleased to announce the release of 5.2.3. Several dependencies …...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
