C++剖析
文章平均质量分 80
不 知
by design.
展开
-
string类的实现
#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <algorithm>#include <set>#include <string>#include <iterator>#include <vector>#include <cstdlib>//using namespace std;//template<class T>原创 2020-09-25 14:40:31 · 75 阅读 · 0 评论 -
C++利用栈来实现一个判断括号是否成对出现的
#include <iostream>#include <algorithm>#include <string>#include <stack>using namespace std;char leftOf(const char& c){ if (c == '}')return '{'; if (c == ')')return '('; if (c == ']')return '['; return '\0';}bool i原创 2020-09-12 17:35:47 · 359 阅读 · 0 评论 -
C++2.0中using的使用Alias Template的使用、简单模板元编程、关键字final的使用、decltype的使用(萃取value_type类型)、lambda表达式的使用和传递给set
下面这个是对的。✔template<typename T>using Vec = vector<T>;下面这个是错误的。❌template<typename T>typedef vector<T> Vec;原创 2020-09-11 21:05:43 · 267 阅读 · 0 评论 -
C++中move和forward(完美转发)在模板编程中的使用、runtime_error异常操作、C++打印[1,2]这种格式打印tuple
move、forward、模板类型推断分析下面这张图是模板类型推断原则:总结引用折叠原则和完美转发是有联系的,可以说后者是基于前者的某些特性实现的,具体来看一下。要理解完美转发,需要了解两个知识点:引用折叠原则(Reference collapsing rules)。右值函数模版参数类型推导(Template argument deduction)我们先来分析一下为什么需要使用到move呢?C++11多出来一个move语义,意图是解决临时对象重复拷贝和释放引发的资源浪费,move原创 2020-09-11 17:06:57 · 388 阅读 · 0 评论 -
C++中什么时候调用拷贝构造和拷贝赋值函数分析
class CopyTest{public: CopyTest(){} CopyTest(CopyTest& cp) { cout << "调用了拷贝构造函数" << endl; } void operator=(CopyTest& cp) { cout << "调用了拷贝幅值函数" << endl; }};CopyTest show(CopyTest mmm){ return mmm;}我们写下以下的测试程序: Co原创 2020-09-11 11:04:08 · 1904 阅读 · 2 评论 -
C++可变参模板使用(实现求最大值)、tuple实现、type_traits的使用、去除const模板的使用、initializer_list的使用
#include <iostream>using namespace std;template <class T>void printd(T a){ cout << a << endl;}template<class T, class...Args>void printd(T a, Args... last){ cout << a << endl; printd(last...);}int ma原创 2020-09-11 09:46:47 · 344 阅读 · 0 评论 -
C++中私有继承所带来的多态权限问题分析
class Base{public: void NoVirtualFun() { printf("Base::NoVirtualFun()!\n"); } virtual void VirtualFun() { printf("Base::VirtualFun()!\n"); }};class ClassA{private: Base* m_pBase;public: ClassA() : m_pBa转载 2020-09-11 09:43:50 · 571 阅读 · 1 评论 -
C++中输入流迭代器istream_iterator的使用、利用模板重载cout来输出自定义类型操作
#include <iostream>#include <fstream>#include <vector>using namespace std;using std::vector;int main(int argc, char *argv[]){ istream_iterator<int> int_in(cin); istream_iterator<int> int_eof; vector<int> vecI原创 2020-09-11 09:47:12 · 348 阅读 · 0 评论 -
C语言和C++函数字符串转数字和数字转字符串的函数
C语言sprintf(数字转字符串)char name[10];sprintf(name, "%d", 100);atoi和atof(分别转换为int和double)cout << atoi("100") << endl;cout << atof("100.03") << endl;C++使用stringstream即可需要头文件 #include <sstream>下面这个例子是将字符串转为int类型的, string原创 2020-09-10 16:08:57 · 283 阅读 · 0 评论 -
C语言实现16进制转为10进制
#include <stdio.h>#include <string.h>#include <math.h>void conver(char arr[]){ int i, j = 0, k = 0, sum = 0, n = strlen(arr); int num[100]; for (i = 0; i < n; i++) { switch (arr[i]) { case 'A':num[j++] = 10; break; c原创 2020-09-10 13:30:02 · 6108 阅读 · 4 评论 -
题目:堆栈溢出一般是由什么原因导致的?
题目:堆栈溢出一般是由什么原因导致的?答:函数调用层次太深。函数递归调用时,系统要在栈中不断保存函数调用时的现场和产生的变量,如果递归调用太深,就会造成栈溢出,这时递归无法返回。再有,当函数调用层次过深时也可能导致栈无法容纳这些调用的返回地址而造成栈溢出。动态申请空间使用之后没有释放。由于C语言中没有垃圾资源自动回收机制,因此,需要程序主动释放已经不再使用的动态地址空间。申请的动态空间使用的是堆空间,动态空间使用不会造成堆溢出。数组访问越界。C语言没有提供数组下标越界检查,如果在程序中出现数组下标原创 2020-09-10 12:50:58 · 1757 阅读 · 0 评论 -
C++ 析构函数中抛出异常是不明智的!
从语法上面讲,析构函数抛出异常是可以的,C++并没有禁止析构函数引发异常,但是C++不推荐这一做法,从析构函数中抛出异常是及其危险的。析构函数可能在对象正常结束生命周期时调用,也可能在有异常发生时从函数堆栈清理时调用。前一种情况抛出异常不会有无法预料的结果,可以正常捕获;但后一种情况下,因为函数发生了异常而导致函数的局部变量的析构函数被调用,析构函数又抛出异常,本来局部对象抛出的异常应该是由它所在的函数负责捕获的,现在函数既然已经发生了异常,必定不能捕获,因此,异常处理机制只能调用terminate()。转载 2020-09-10 12:45:02 · 764 阅读 · 0 评论 -
C++三元运算符特点记录
一般情况下,三木运算符需要两个表达式类型一致,但是如果出现不一致的地方也可以进行转换,转换是有一定的规则的。下面我们来简单分析一下:代码一:cout << (1 > 2 ? 1 : "1") << endl;代码二:cout << (1 > 2 ? 0 : "1") << endl;代码三:cout << (1 > 2 ? "hello" : "hi") << endl; 结果是.原创 2020-09-10 11:30:30 · 220 阅读 · 0 评论 -
求一个int型的数据转换为二进制里面包含1的个数
通过下面函数可以求一个数据转换为二进制数据中1的个数比如0xFFFFFFFF求得的结果是:32int func(x) { int countx = 0; while(x) { countx ++; x = x&(x-1); } return countx; }...原创 2020-09-10 11:13:39 · 728 阅读 · 0 评论 -
include““和incude<>区别
include< file >编译程序会先到标准函数库中找文件include”file” 编译程序会先从当前目录中找文件参考原文转:在C程序中包含文件有以下两种方法:(1)用符号“<”和“>”将要包含的文件的文件名括起来。这种方法指示预处理程序到预定义的缺省路径下寻找文件。预定义的缺省路径通常是在INCLUDE环境变量中指定的,请看下例:INCLUDE=C:\COMPILER\INCLUDE;S:\SOURCE\HEADERS;对于上述INCLUDE环境变量,如果用#i转载 2020-09-09 19:49:18 · 302 阅读 · 0 评论 -
C++三种继承方式对比图
原创 2020-09-04 16:15:32 · 206 阅读 · 0 评论 -
C++中Volatile、const、static用法
这三个关键字都是很重要的,注意,static主要是进行文件和函数隔离的操作。Volatile的使用A volatile specifier is a hint to a compiler that an object may changeits value in ways not specified by the language so that aggressiveoptimizations must be avoided.volatile 关键字是一种类型修饰符,用它声明的类型变量表示可原创 2020-09-03 12:47:51 · 614 阅读 · 0 评论 -
memcpy和memmove的区别
memmove在copy两个有重叠区域的内存时可以保证copy的正确,但是memcpy就不可以保证有重叠区域的拷贝是正确的。memcpy的源码void *memcpy(void *dest, const void *src, size_t count){assert(dest != NULL || src != NULL);char *tmp = (char *)dest;char *p = (char *)src;while (count--){*tmp++ = *p++;}.原创 2020-09-02 20:03:52 · 82 阅读 · 0 评论 -
C++内存管理之分配器雏形
c++中每次malloc会带有调试头和尾,记录当前区块大小的头和尾。因此我们尽可能需要减少malloc的调用次数,又因为new底层也是malloc实现的,因此,也需要减少其调用次数。我们可以通过设计内存池来管理一个内存链表,每次分配较多的数量,并依次进行取用。下面是代码实现:实现原理是内嵌指针的操作。请注意:该分配器只适用于内存大于4字节的分配,因为内嵌指针需要寄托在未分配内存上,因此,其内存大小必须大于指针的字节数 。 大于 4#include <iostream>#inclu..原创 2020-08-31 21:19:48 · 94 阅读 · 0 评论 -
C++虚继承和虚析构函数
虚继承当一个基类被声明为虚基类后,即使它成为了多继承链路上的公共基类,最后的派生类中也只有它的一个备份。例如:class CBase { };class CDerive1:virtual public CBase{ };class CDerive2:virtual public CBase{ };class CDerive12:public CDerive1,CDerive2{ };则在类CDerive12的对象中,仅有类CBase的一个对象数据。虚析构函数如果没有虚析构函数,父类指针d原创 2020-08-31 14:22:40 · 856 阅读 · 0 评论 -
贪心算法实现从电台的问题
#include <iostream>#include <algorithm>#include <set>#include <string>#include <iterator>#include <vector>#include <map>#include <functional>using namespace std;int main09(){ map<string, set&l原创 2020-08-27 20:57:12 · 145 阅读 · 0 评论 -
C++模板技术探究仿函数、适配器、模板特化
C++中算法无非是传入(1)迭代器(2)仿函数(适配器)仿函数仿函数主要时进行算法调用自定函数的用途。我们来实现仿函数的时候,尽可能包含下面这三个类型定义:因为他是和适配器之间结合的桥梁,当函数对象与适配器接口的时候,适配器需要询问这三个问题,如果不存在这三个类型定义,那么该仿函数会变得很不灵活,不能与适配器进行结合使用。typedef _Ty first_argument_type;typedef _Ty second_argument_type;typedef bool result_原创 2020-08-26 16:58:10 · 214 阅读 · 0 评论 -
C++中set和unordered_set区别、ostream_iterator的使用
底层不相同,set底层是红黑树,红黑树又为平衡树,因此红黑树是有序的,无序set底层为哈希表,散列表,因此是无序的,访问方式由哈希函数算出的Bucket进行访问。sort算法中的排序函数不能给无序容器进行排序#include <iostream>#include <algorithm>#include <vector>#include <unordered_set>#include <iterator>#include <s.原创 2020-08-25 13:39:11 · 192 阅读 · 0 评论 -
顺时针打印
可以通过指定四个方向,上下左右,判断下个方向应该是朝哪个方向。代码如下:简单易懂#include <iostream>#include <cstdlib>#include <string.h>using namespace std;enum Direction{ RIGHT, DOWN, LEFT, UP};int snake[4][4]{0};Direction dd = RIGHT;Direction judgeD.原创 2020-08-24 09:47:38 · 91 阅读 · 0 评论 -
蛇形打印
打印蛇形矩阵,如下图所示,行和列用不同颜色表示。import numpy as npif __name__ == '__main__': num = input("请输入矩阵的维数\n") num = int(num) mat = [[0 for i in range(num)] for j in range(num)] print(mat) value = 1 for row in range(num): if row % 2 == 0原创 2020-08-23 15:44:53 · 195 阅读 · 0 评论 -
VS2017设置结构体字节对齐大小
如下面这个结构体:typedef struct P{ double a; int c; char b; int d;}PPP;通过 sizeof 计算其内存,大小为多少?答:如果是默认的设置的话,其大小应该为 24是因为结构体存在字节对齐的概念,为了提高存取效率,32位的计算机,一次可以读取4个字节的内存,如果不进行字节对齐操作,读取一个 int 值的数据,可能需要两次读取内存操作,大大的减小了内存读取效率,这个编译器优化的部分,当然也可以自己设置。那么,如何设置呢?1、通过VS原创 2020-08-18 14:36:14 · 3938 阅读 · 0 评论 -
C++如何将16进制赋值为浮点数
一般情况下,我们在C++中将16进制形式赋值给整数类型,我们可以通过如下的操作:unsigned int aaa = 0x00000020;但是如果直接将该16进制数赋值给浮点数,等同于如下操作float bbb = 0x00000020;float ccc = float(int(0x00000020));可以看出来,编译器并不会以内存的形式来转换成float,而是先转换成 int 类型的,然后将此 数 强转为 float。正确操作应该是如下:unsigned int aaa = 0x0原创 2020-08-16 17:19:12 · 2788 阅读 · 0 评论 -
计算机中CRLF、CR、LF详解
很长一段时间里,对于CRLF、CR、LF的理解仅限于不同操作系统下对换行符的定义。所谓知其然需知其所以然,从学习中找到乐趣,对知识的记忆才会更加深刻。名词解释CR:Carriage Return,对应ASCII中转义字符\r,表示回车LF:LineFeed,对应ASCII中转义字符\n,表示换行CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行Windows操作系统采用两个字符来进行换行,即CRLF;Unix/Linux/Mac OS X操.转载 2020-08-05 09:33:02 · 4624 阅读 · 0 评论 -
三维空间内两条直线的交点
https://blog.csdn.net/hunter_wwq/article/details/41044179转载 2020-06-12 14:08:45 · 3321 阅读 · 0 评论 -
time_wait是客户端还是服务端的状态???
上面这张图片描述了客户端作为断开链接发起者的TCP四次挥手的过程。time_wait其实并不能说是服务器还是客户端的状态,因为他其实是一个主动断开链接发起者的状态,在发送最后一次ACK后进入time_wait状态。...原创 2020-05-19 21:25:33 · 2390 阅读 · 0 评论 -
C++类中初始化列表的顺序???
关于类的初始化列表,我们可能熟悉这个语法,但是几乎没有注意过其中实现的细节。例如下面有一个面试题:class A { private: int n1; int n2; public: A() :n2(0), n1(n2 + 2) { } 那么,这样的初始化最后的n1 和 n2 的值是多少呢???有很多人可能会说n1 = 2, n2 = 0;这个是错误的,其实正确的是n1 = 垃圾值,n2 = 0原创 2020-05-19 21:07:58 · 293 阅读 · 0 评论 -
C++ostream_iterator关于文件操作的用法
Content1、打印控制台2、操作文件ostream_iterator是输出流迭代器,可以用作打印控制台和输出文件的操作,下面我们看具体操作:1、打印控制台这个测试程序用到了关于数据计算的算法:partial_sum函数是一个模板函数,可以实现求取部分和的行为,或者可以自定义仿函数来实现求取需要要求的行为。int main(int argc,char *argv[]){ vector<int> v2{ 1,2,3,4 }; ostream_iterator<int>原创 2020-05-19 17:34:05 · 745 阅读 · 0 评论 -
Qt解决资源文件中无法显示图片的问题
血的教训,在你添加完资源文件以后,一定要先菜单栏->构建->qmake一下,否则是无法显示的。浪费好长时间找问题。。。。void MainWindow::paintEvent(QPaintEvent *event){ QPainter painter(this); QPixmap pixmap; pixmap.load(":/image/sky.jpg"); painter.drawPixmap(0, 0, this->width(), this-&g原创 2020-05-19 10:50:00 · 8411 阅读 · 12 评论 -
C++文本文件某行插入内容、ifstream、getline、stringstream函数的应用
Content ifstream:getline:stringstream:将字符串插入文本文件中某行的操作:很多时候我们说C++不如Python、Java之类的语言使用简便,这个在某些时候是很客观的。像Python关于文件的操作readline、readlines等函数就可以解决一切。但是“C++”的函数File、fscanf、fprintf等函数真的麻烦又麻烦。其实,我们很多人用的函数属于古老C++或者很多都是C的接口。下面我们就来看一下C++关于文件操作的函数:关于详细文件(继承关系和函数)的介绍原创 2020-05-11 17:19:45 · 4507 阅读 · 0 评论 -
C++类成员变量指针和类成员函数指针、nullptr的底层实现
C++中指向类成员变量指针和成员函数指针的定义方法我们知道,如果我们需要在C++中用到关于类成员的函数或者变量,就必须使用域运算符。那么我们该如何定义指向类成员变量的指针呢?格式为:*类型名(类名::指针名) = &类名::类的成员变量名成员变量指针调用:*对象名.成员变量指针名我们通过下面的简单程序来认识它:class Myclass{public: Myclass...原创 2020-05-03 21:13:12 · 1163 阅读 · 0 评论