当前位置: 首页 > news >正文

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复习-线程的同步和死锁

线程的同步和死锁 同步问题引出 当多个线程访问同一资源时&#xff0c;会出现不同步问题。比如当票贩子A&#xff08;线程A&#xff09;已经通过了“判断”&#xff0c;但由于网络延迟&#xff0c;暂未修改票数的间隔时间内&#xff0c;票贩子B&#xff08;线程B&#xff09;…...

Qt指示器设置

目录 1. 样式设置 2. 行为设置 3. 交互设置 创建一个进度指示器控件 在Qt中设置指示器&#xff08;Indicator&#xff09;的外观和行为通常需要操作相关部件的属性和样式表。以下是如何在Qt中设置指示器的一些常见方式&#xff1a; 1. 样式设置 你可以使用样式表&#xf…...

计算机网络第四节 数据链路层

一&#xff0c;引入数据链路层的目的 1.目的意义 数据链路层是体系结构中的第二层&#xff1b; 从发送端来讲&#xff0c;物理层可以将数据链路层交付下来的数据&#xff0c;装换成光&#xff0c;电信号发送到传输介质上了 从接收端来讲&#xff0c;物理层能将传输介质的光&…...

Vue.js not detected解决方法

扩展程序》管理扩展程序》详情》允许访问文件地址打开...

Window10安装PHP7.4

1. 下载PHP 7 首先需要下载PHP 7的安装包&#xff0c;可以从PHP官网&#xff08;https://www.php.net/downloads.php&#xff09;或者Windows下的PHP官网&#xff08;http://windows.php.net/download/&#xff09;下载Windows版本的PHP 7安装包。根据自己的系统架构&#xff…...

【C++刷题】二叉树进阶刷题

根据二叉树创建字符串 class Solution { public:/** ()的省略有两种情况* 1.左右都为空&#xff0c;省略* 2.左子树不为空&#xff0c;右子树为空&#xff0c;省略*/string tree2str(TreeNode* root){string s;if(root nullptr){return s;}s to_string(root->val);if(root…...

有效的数独

有效的数独 题目: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。示例 1&#xff1a; 输…...

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 存储网关&#xff08;可选&#xff0c;根据需要选择使用&#xff09;组成。 没有元数据服务器组件&#xff0c;这有助于提升整个系统的性能、可靠性和稳定性。 …...

22 相交链表

相交链表 题解1 快慢双指针改进 (acb bca)题解2 哈希表(偷懒) 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 题目数据 保证 整个链式结构中不存在环。 注意&#xff…...

简历(快速上手)

简历 文章目录 简历简历模板:排版上:内容上:沟通上: 简历在面试中起到关键作用 网申,HR只会花10秒多来看一下 内推,如果简历没优势就只能pass 简历模板: ⽊及简历&#xff08;推荐! &#xff09; &#xff1a; https://resume.mdedit.online 排版上: 尽量简洁&#xff0c;…...

wpf复制xaml及其cs窗体到其他项目 添加现有项,选 .xaml.cs,点添加即可。VS2022

添加现有项&#xff0c;选 LoadingWindow.xaml.cs&#xff0c;点添加即可。...

在线旅游平台步入新时代,携程如何走出自己的路?

今年旅游从线下到线上全方位火了。有统计数据&#xff0c;一季度&#xff0c;光是抖音&#xff0c;旅游达人发布视频数量就高达175万条&#xff0c;播放量1350亿次&#xff0c;收获27亿次点赞。在这一趋势下&#xff0c;许多“不出名”的景区和酒店借势抖音达人完成“出圈”。短…...

java中feign远程调用底层是用Hystrix作为熔断器吗?

在较新的版本中&#xff0c;Feign 默认使用 OpenFeign 作为远程调用的底层实现&#xff0c;并且集成了 Netflix Hystrix 作为熔断器。然而&#xff0c;需要注意的是&#xff0c;自 Feign 10.x 版本开始&#xff0c;默认已不再集成 Hystrix。 在 Feign 中&#xff0c;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. 总结 上一篇文章&#xff0c;介绍了基于STM32F103的JTAG边界扫描应用&#xff0c;演示了TopJTAG Probe软件的应用&#xff0c;以及边界扫描的基本功能。本文介绍基于Xilinx FPGA的边界扫描应用&#xff0c;两者几乎…...

苍穹外卖集成 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 …...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...