![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
学习
文章平均质量分 62
For Nine
这个作者很懒,什么都没留下…
展开
-
C++ 模板与泛型编程 《C++Primer》第16章(上)———— 读书笔记
1、定义模板以函数模板为例:template <typename T, typename U> T func_name(const T& x, const U& y){ // ...... //} 模板定义以关键字 template 开始,后跟一个模板参数列表。模板参数列表不能为空。使用模板时,我们(隐式或显示的)指定模板实参,把他绑定到模板参数上。当调用函数模板时,编译器会推断模板参数,并用推断出的模板参数实例化一个特定版本的函数。这种被编译器生成的版本被称为原创 2022-04-01 10:49:53 · 449 阅读 · 0 评论 -
C++ 面向对象程序设计 《C++Primer》第15章(下篇)———— 读书笔记
1、虚析构函数顾名思义,把析构函数定义为virtual的,为什么要这样?不同以往,继承体系中,是有可能出现静态类型和动态类型 不匹配的情况的。比如,我们delete一个父类类型的指针,但该指针实际指向了一个子类对象,这时,就必须知道该调用哪个版本的析构函数。为此,虚析构函数是 必要的 。只要在父类里把析构函数定义为virtual,其虚属性会被自动继承。这样继承体系的所有析构函数都能实现动态绑定。虚析构函数会 阻止 合成移动操作首先来复习一条规则:都什么东西算拷贝控制成员呢?下面这五个:原创 2022-03-28 20:30:12 · 321 阅读 · 0 评论 -
C++ VS2019报错 无法解析的外部符号 XXXXXXX 函数main中引用了该符号
错误相关文件:AndQuery.h#pragma once#ifndef _ANDQUERY_H_#define _ANDQUERY_H_#include"BinaryQuery.h"using namespace std;class Query;class AndQuery : public BinaryQuery{ friend Query operator&(const Query&, const Query&); AndQuery(const Qu原创 2022-03-28 12:49:13 · 3835 阅读 · 0 评论 -
C++ 面向对象程序设计 《C++Primer》第15章(上篇)———— 读书笔记
1、深入虚函数1.1 所有虚函数都必须提供定义由于虚函数的动态绑定特性,编译器无法在编译阶段就确定到底会使用哪个版本的虚函数,所以所有的虚函数都必须提供定义。1.2 派生类中的虚函数要 严格 模仿基类虚函数派生类的虚函数返回值,和参数列表都要和基类的一模一样。只有一个例外:1.3 override说明符被override修饰的函数,必然覆写了基类中同名的的虚函数,必然和他有着相同的返回值和参数列表。override存在这种特性的原因之一是:当我们在派生类中定义一个与基类虚函数同名,但是返原创 2022-03-24 19:28:54 · 1215 阅读 · 0 评论 -
C++ 面向对象程序设计——基础知识
派生类自定义的数据成员和继承自基类的数据成员不一定是连续存储的。1、 虚函数:任何构造函数之外的非静态函数都可以是虚函数。virtual只能出现在类内部的声明语句,不能用于类外部的函数定义积累声明一个虚函数,该函数在派生类中也是虚函数派生类也可不去自定义,这样就直接继承基类的虚函数2、 动态绑定:动态绑定又叫运行时绑定。用virtual修饰过的成员函数在基类和派生类中有不同的版本,这些函数的实际运行版本由实参决定,即在运行时选择函数的版本,因此得名。3、 protected关键字:原创 2022-03-21 21:13:37 · 1343 阅读 · 0 评论 -
C++ 操作重载与类型转换 《C++Primer》第14章 读书笔记
1、基本概念 和 限制条件只有重载的函数调用运算符operator()能有默认实参,其他重载运算符不能有默认实参。一个重载的运算符,至少含有一个类类型的参数。可被重载的运算符:一般不重载&& || , &这几个运算符返回值类型一般与内置版本兼容:逻辑和关系运算符返回bool算术运算符返回类类型的值赋值运算符 和 复合运算符 返回左侧运算对象的引用若一个运算符是成员函数,则他的左侧运算对象绑定到隐式的this指针上。这就是为什么后面重载<原创 2022-03-21 10:47:51 · 807 阅读 · 0 评论 -
C++ Visual Studio报错:LNK1169: 找到一个或多个多重定义的符号————解决办法
1、.h文件里的函数声明和定义都要加上inline2、声明全局变量,全局函数一定要 在.cpp中声明 其他类引用该全局变量就include该.cpp对应的头文件,然后再extern一下原创 2022-03-19 13:45:22 · 1737 阅读 · 0 评论 -
C++ 拷贝控制 《C++Primer》第13章 读书笔记
1、拷贝构造函数一个构造函数,第一个参数是自身类型的引用,且其余参数都有默认值,则这是个拷贝构造函数。除了传非引用参数、返回非引用返回值外,用花括号列表初始化一个数组中的元素或一个聚合类中的成员时也会发生拷贝初始化。调用标准库容器的insert 或 push成员时,也会进行拷贝内初始化,用emplace则是直接初始化。2、拷贝构造函数拷贝构造函数和拷贝赋值运算符的区别:【拷贝构造函数调用】的结果 会有新对象生成,而拷贝赋值运算符则并没有。拷贝构造函数会在对象初始化的时候调用,而调用赋值运算符原创 2022-03-19 07:55:26 · 307 阅读 · 0 评论 -
C++ 智能指针 unique_ptr 不可拷贝的例外情况,“可拷贝或赋值一个将要被销毁的unique_ptr”
书上的例子是这样的:我们可以拷贝或赋值一个将要被销毁的unique _ptr。最常见的例子是从函数返回一个unique_ptr如下面代码所示:unique_ptr<int> clone(int p){ return unique_ptr<int>(new int(p));}还可以返回一个局部对象的拷贝:unique_ptr<int> clone(int n){ unique_ptr<int> ret(new int(p)); retur原创 2022-03-18 16:00:47 · 749 阅读 · 0 评论 -
C++ 动态内存管理类:自实现简易 vector ,只能存 string 。《C++Primer》13.5小节
说是自实现vector,其实就是尽量模拟出vector所具有的操作。1、类 应有的成员1、三个成员变量:elements,指向首元素first_free,指向实际存在元素之后的位置cap,指向分配的内存末尾之后的位置2、一个【静态alloctor成员】,用于给【所有】vector对象【分配内存空间】。3、需要4个工具函数,管理每个vector的内存空间。由于他们是用于实现这个类的,所以应该是私有的成员函数。...原创 2022-03-17 17:22:25 · 1089 阅读 · 0 评论 -
C++ 随记三 (一些杂项)
1、使用只读算法时,传参要注意:比如,accumulate就是个只读函数:string sum = accumulate(s.cbegin(), s.end(), string(""));插一嘴,最后一个参数必须是string(""),不能只写一个空字符串""上去,因为第三个参数的类型决定accumulate函数调用哪种类型的+运算符,而const char*没有+运算符,会产生编译错误。2、使用equal的注意事项equal不能比较两个【C风格的字符串】是否相等。因为C风格的字符串本质是c原创 2022-03-16 20:05:16 · 1243 阅读 · 0 评论 -
C++ 内联函数一定要定义在头文件中,而不是源文件
在跟着《C++Primer》编写一个小工程的时候,编译器报了这样的错误:这错误真离谱,令人头大。查前几条报错信息,看了半天,整不明白。然后我直接搜最后一个报错信息,搜到一篇很棒的博客,真是救命了啊,那篇博客在这里。总的来说就是: 内联函数(inline)给我写到头文件里面,不要写在源文件里 啊啊啊啊!!!!!引用原博客的话:inline函数没有写在.h文件中,因为inline函数定义只能在声明它的文件中找到,所以inline函数的定义不能和声明分开写在两个文件中引用自:C++初转载 2022-03-14 13:07:06 · 1285 阅读 · 0 评论 -
VS2019 创建类时报错:未注册类——解决方法
保存一下当前整个项目,关闭VS,重新打开VS就可以了,反正我的是这样的。原创 2022-03-13 17:20:36 · 3219 阅读 · 1 评论 -
C++ 动态内存 《C++Primer》第12章 读书笔记
1、智能指针1.1 两种智能指针shared_ptr 和 unique_ptr共有操作:shared_ptr独有的操作:使用make_shared构造对象时,如果不传递任何参数,对象就会进行值初始化。2、直接管理内存(不用智能指针,而是用new 和 delete)2.1 使用new动态分配和初始化对象默认情况下,用new动态分配的对象时默认初始化的。(注意不是值初始化)但我们可以在初始化的时候使用 直接初始化(()里面直接写上初值) 、构造函数初始化 、 列表初始化 、以及值初始化(原创 2022-03-13 09:06:17 · 196 阅读 · 0 评论 -
C++ 关联容器 《C++Primer》第11章 读书笔记
1、pair类型1.1pair的操作1.2 函数返回pair类型时,可对返回值进行列表初始化pair<string, int> process(string& s){ if (!v.empty()) return { s, s.size() }; 列表初始化 else return pair<string, int>(); 隐式构造返回值,构造一个空pair,并返回1.3 小练习1、map<string, size_t> c原创 2022-03-10 16:14:10 · 661 阅读 · 0 评论 -
C++泛型算法 《C++Primer》第10章
1、泛型算法思想一个算法可用于多种数据类型,算法与所操作的数据结构分离泛型使用迭代器作为 算法 与 数据结构 的桥梁1.1 引 例:find函数find函数能找到序列中目标值的位置,他接受三个参数,分别是序列的起止位置,以及要找的值。为了充分理解泛型算法【思想】,我们来看find函数如何工作:1:访问序列中的首元素2:比较此元素与我们要查找的值3:如果此元素与我们要查找的值匹配,返回【标识】此元素的值。4:否则,前进到下一个元素,重复步骤2和3。5:如果到达序列尾,算法停止原创 2022-03-09 13:56:38 · 574 阅读 · 0 评论 -
《C++Primer》第九章 顺序容器——笔记
1、容器的基本操作下图列出了,所有容器(除特殊标注的容器外)都支持的【基本】操作:2、迭代器2.1 迭代器支持的 公共 操作如下:forward_list迭代器不支持递减运算符2.2 支持迭代器的容器如下:2.3 vector 和 string的【迭代器】支持的运算如下:list的【迭代器】不支持关系运算符,只支持 ++ -- == !=3、创建容器对象有如下几种定义和初始化方式:【值初始化】:由容器中所装【元素的类型】决定如何初始化,如果是int,则初始化0原创 2022-03-07 10:43:04 · 347 阅读 · 0 评论 -
C++随记 二(C++Primer读书笔记)
1、常量成员函数当调用成员函数时,隐式参数this的类型一般都是常量指针。这意味着,默认情况下一个常量对象无法调用它的成员函数,为了解决这个问题(同时提高函数的灵活性),我们使用常量成员函数。然而,this是隐式的,不会出现在形参列表中,我们通过以下方法实现目的:std::string isbn() const { return this->book_number; }向上面这样,在成员函数的形参列表后面加上const关键字就表示this是一个指向常量的指针。2、轻量化默认构造函数Per原创 2022-03-07 10:42:30 · 161 阅读 · 0 评论 -
C++ string::insert的常用【重载】
1、string& insert(int index, const char* s)在下标为index的位置,插入【整个】字符串s2、string& insert(int index, const char* s, int n);在下标为index的位置,插入字符串s的前n个字符3、string& insert(int index, const string& s)在下标为index的位置,插入【整个】字符串s4、string& ins原创 2022-03-06 18:27:22 · 672 阅读 · 0 评论 -
《C++Primer》精彩练习题 9.3.1 练习9.22 (原书P309页 习题集P205页)
练习 9.22假定iv是一个int的vector,下面的程序存在什么错误?你将如何修改?vector<int>::iterator iter = iv.begin()vector<int>::iterator mid = iv.begin() + iv.size() / 2;while (iter != mid) if (*iter == some_val) iv.insert(iter, 2 * some_val);第一问:有什么错误???向一个vecto原创 2022-03-05 20:21:54 · 526 阅读 · 0 评论 -
《C++Primer》8.3.1节练习 8.11 (原书第288页,习题集190页)
#include<iostream>#include<string>#include<vector>#include<sstream>struct PersonInfo{ string name; vector<string> phones; void print() const 这里的const也很关键,开始写的时候忘加了,主循环里的for循环就会报错 { cout << name <<.原创 2022-03-04 22:18:51 · 301 阅读 · 0 评论 -
《C++Primer》第8章 IO类 笔记
1、几种标准库IO类型几种类型间的继承关系,如下图:2、IO类型无拷贝和赋值这也是为什么这种类型作为函数返回值时,返回的是引用。3、IO类的条件状态条件状态是指:一组标志和函数,可以告诉我们指定的 (IO) 流是否可用,也就是我们刚刚的输入合不合法,这组标志和函数可被任何IO类使用。下面的表列出了所有的条件状态(标志和函数)。其中 “strm” 代指所有的IO类。置位:强制置1复位:强制置0当输入出现错误时,我们可以用上面的函数和标志位检查出来,如下面例子所示:cou原创 2022-03-04 21:51:26 · 591 阅读 · 0 评论 -
C++随记 一
对象:基本原则:里面有数据受保护,外面有访问数据的操作,不能直接接触到数据。接收者自己决定做不做某个动作(然是如果他根本没有提供这样的服务呢?要直接去操作他的数据吗?)Class: 事物归纳总结成一个类别,东西的总类,相似的东西起个名字,是一个概念Object:东西,实体...原创 2022-03-01 20:47:17 · 421 阅读 · 0 评论 -
C++——利用vector的swap()成员收缩内存
直接上示例代码:#include<iostream>#include<string>#include<vector>#include<iterator>using namespace std;int main(){ vector<int> v; for (int i = 0; i < 100000; i++) { v.push_back(i); } cout << "v的容量" <<原创 2022-02-27 09:47:11 · 613 阅读 · 0 评论 -
C++深拷贝、浅拷贝 以及默认拷贝构造函数的缺陷
1、深拷贝 和 浅拷贝1.1 深拷贝深拷贝就是一般的赋值语句。//深度拷贝int a = 5;int b = a;1.2 浅拷贝浅拷贝是简单的指针指向。//浅拷贝int a = 8;int *p;p = &a;char* str1 = "HelloWorld";char* str2 = str1;综上所述:拷贝者和被拷贝者若是同一个地址,则为浅拷贝,反之为深拷贝。2、C++的默认拷贝构造函数1.1 拷贝构造函数class cls{pubic: //原创 2022-01-28 17:44:08 · 730 阅读 · 0 评论 -
快速选择第k小的数——基于快速排序
AcWing 第k个数给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。输入格式第一行包含两个整数 n 和 k。第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。输出格式输出一个整数,表示数列的第 k 小数。数据范围1 ≤ n ≤ 1000001 ≤ k ≤ n输入样例:5 32 4 1 5 3输出样例:3快速选择的重点在于,在递归时,只递归含有k的区间,这样省去了对另一个区间不必要的处理过程原创 2022-01-28 10:11:07 · 455 阅读 · 0 评论 -
线代——猴博士笔记
求向量组的秩,先求极大无关组,极大无关组里几个向量,秩就是几什么是极大无关组?从一向量组挑出几个向量,他们线性无关,且原来向量组中任意一个向量加进去,又变成了相关的。什么是线性无关?对于一向量组,存在 不全为0的实数k1-km 使得这些数与每个向量相乘的和 = 0...原创 2022-01-12 12:31:49 · 14971 阅读 · 1 评论 -
计算机网络微课堂——第五章—运输层
第五章 运输层1、概述2、运输层端口号、复用与分用的概念2.1 端口号2.2 发送方的复用和接收方的分用复用:从上往下封装分用:从下往上交付2.3 TCP/IP体系的应用层常用协议所使用的运输层数值==熟知端口号运输层的端口号区分 应用层 具体是哪个应用程序。网络层的协议字段区分 运输层具体是哪个协议。2.4 通过实例更清晰的理解运输层端口号的作用这个太麻烦了,不好叙述,你自己脑海里想一遍过程,忘记了就去看这个视频,从6分钟开始。3、UDP原创 2022-01-09 19:31:32 · 1303 阅读 · 0 评论 -
计算机网络微课堂——第六章—应用层
第六章 应用层1、概述应用层具体是什么?本章关于应用层学什么?还是不太哦清晰?再往下看。万维网WWW应用,超文本传送协议HTTP:除了万维网WWW,还有:后面会对以上网络应用做一一介绍。2、客户/服务器方式(C/S)和对等方式(P2P)2.1 引入2.2 客户服务器/方式(C/S)(Client/Server)2.3 对等方式(P2P)(Peer-To-Peer)假设上图中E、F、D都在使用P2P文件共享,我们可以想象成:E的P2P进程正在从F下载文件,同时还在为D的P2原创 2022-01-09 19:30:51 · 1297 阅读 · 0 评论 -
计算机网络——IPv6地址(待更新)
3.5 静态路由配置及其可能产生的路由环路问题3.5.1 概述本小节主要通过几个实例来讲解上述三种情况产生的回路,及其解决方法。不过在其中也能加深对之前所学部分知识的理解。3.5.2 基础知识静态路由:路由器可通过自己的某一接口所配置的IP地址和地址掩码,得出该接口所在的网络(与运算)。由于该网络与该接口直连,所以下一跳并不是其他路由器的接口的IP地址,而是通过该接口直接转发数据报给网络中的主机。这属于直接交付,这条自动得出的路由属于直连路由。如下图例子所示:综上所..原创 2022-01-09 16:56:50 · 1060 阅读 · 0 评论 -
计算机网络微课堂——第四章—网络层(下)
3.5.4 聚合了不存在的网络而导致路由环路上例子:这里要好好理解一下聚合路由的概念和求取过程。聚合路由:多个网络归(聚合)到一个大类,在查表的时候,查找到这个大类,就相当于查找到了具体的目的网络,因为他们的下一跳是相同的。你只要转发给下一跳,下一跳就能根据目的网络转发给具体的主机。在查表的时候,这些具体的目的网络可以匹配聚合网络,原理是最长前缀匹配。注意:发送数据包的时候目的地址 还是具体的目的网络,只是你在查找转发的时候走了聚合路由的路子,数据报的目的网络并不是聚合网络。...原创 2022-01-06 12:03:47 · 2779 阅读 · 0 评论 -
计算机网络——组播地址(多播地址、D类地址)详解——不断完善更新中
1、是什么先看这张图,组播地址是分类编址的IPv4地址中的D类地址,又叫多播地址,他的前四位必须是1110,所以网络地址的取值范围是224~~239。2、这些IP地址用来做什么224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内原创 2022-01-05 17:33:43 · 35697 阅读 · 1 评论 -
计算机网络微课堂——第四章—网络层(上)——截止 静态路由配置及可能产生的路由环路
第四章 网络层1、概述网络层主要任务是实现网络互连,进而实现数据包在各网络之间传输。在实现中需要解决以下问题:网络层向运输层提供怎样的服务(可靠 OR 不可靠)网络层寻址问题路由选择问题2、网络层提供的两种服务(非重点)2.1 面向连接的虚电路服务 和 无连接的数据包服务3、IPv4地址3.1 IP、IPv4、IPv6这仨啥关系IP地址就是给因特网(Internet)上的每一台主机(以及路由器)的每一个接口分配一个在全世界范围内唯一的标识符。IPv4和原创 2022-01-04 22:50:52 · 1348 阅读 · 0 评论 -
集线器、中继器、网桥、交换机、网关、路由器——今天必把你们区分开
1、中继器(Repeater)所属层次:物理层 功能:简单的信号放大器,放大传输中衰减的信号,使传更远2、集线器(Hub、多口中继器)所属层次:物理层 功能:多端口的中继器,可实现多计算机互联3、网桥(Bridge)所属层次:数据链路层 功能:转发帧的,把一个局域网一分为二(也可以理解为连接两个局域网), 辅助的同时限制两个局域网的通信4、交换机(Switch)所属层次:数据链路层+网络层 功能:高级网桥,端口更多,原创 2022-01-03 16:52:21 · 1135 阅读 · 0 评论 -
计算机网络微课堂——第三章—数据链路层(下)
第三章 数据链路层(下)5.4 随机接入——无线局域网协议:CSMA/CA载波监听多址接入/碰撞避免 CSMA/CA(Carrier Sense Multiple Access/Collision Avoidance)无线局域网中,碰撞发生在接收的时候而不是发送...原创 2022-01-02 11:45:13 · 1370 阅读 · 0 评论 -
计算机网络微课堂——第三章—数据链路层(上)截止至 CSMA/CD 协议
第三章 数据链路层1、封装成帧如果数据部分存在与帧定界标识符相同的字节该怎么办?很显然这样不能实现透明传输。所以数据链路层针对不同的链路(同步,异步)采用不同的方式来解决这个问题。面向字节的链路:字节填充法,添加转义字符,表示后面的并不是帧定界标识符面向比特的链路:比特填充法,每 5 个1后面添加一个0,不允许他出现 “01111110”2、差错检测循环冗余校验 CRC注:这里的除法在计算时需要做异或运算。和普通除法不一样。最后检查余数:余数位数与生成原创 2021-12-31 22:12:34 · 1864 阅读 · 0 评论 -
大物---期末复习
求电场强度结论求电势公式求圆环电势公式原创 2021-12-29 08:28:03 · 1855 阅读 · 0 评论 -
数据库—应付考试—期末复习
简答题1、简述计算机数据管理技术发展的三个阶段人工管理文件系统管理数据库管理2、数据管理系统有哪些主要功能数据定义数据操纵增删改查数据库的事务管理和运行管理数据组织、存储和管理数据库的建立和维护数据通信接口编程题...原创 2021-12-25 15:26:37 · 1611 阅读 · 0 评论 -
朴素版Dijkstra(最短路径)算法
一、本算法的适用范围1、求单源最短路的情况,即某两个点之间的最短路。2、所有边权都是正数3、稠密图设一个图中:点数为n,边数为m稠密图:m与n*n是一个级别稀疏图:m与n是一个级别如:题目给出测试点的范围是:1<=n<=500 1<=m<=100000这显然是一个稠密图。二、时间复杂度:O(n*n);三、朴素版Dijkstra算法实现1、...原创 2021-12-21 23:33:43 · 1096 阅读 · 3 评论 -
计算机网络微课堂——第一、二章—概述、物理层
1、ISP:2、三种交换方式:3、存储大小与传输速率的区别:估算时,存储单位和速率单位可以约掉。4、发送时延和传播时延谁更长需要根据具体问题去分析,不是绝对的。5、时延带宽积:...原创 2021-12-20 22:54:59 · 374 阅读 · 0 评论