C++
不 知
by design.
展开
-
C++求数组大小的模板
template<typename T, int N>char(&f_num_els(T(&)[N]))[N];#define F_NUM_ELS(x) int(sizeof(f_num_els(x)));下面进行测试函数:// test1 int a[5]; cout << F_NUM_ELS(a); cout << endl; // test2 int b[1][5]; cout <原创 2021-11-29 20:34:26 · 735 阅读 · 0 评论 -
^异或的性质和使用
^表示异或,也就是相同为0,不同为1 。其有很多性质:a ^ a = 0。 a ^ 0 = a等使用异或交换a 和 b的值。a = 5;b = 6;a = a ^ b;b = a ^ b;a = a^ b;该段代码执行完,就交换 a 和 b 的值了。不用添加任何代码...原创 2021-07-11 23:20:27 · 508 阅读 · 0 评论 -
C++STL中sort函数的分析
大神的解释原创 2021-01-11 22:02:18 · 91 阅读 · 0 评论 -
C++set误区
vector<int> data1{ 1,2,3 }; vector<int> data2{ 1,2,3 }; dataSet.insert(data1); dataSet.insert(data2);这个也是相同元素,只有一个被添加至末尾。注意不是相同的vector<int>,而是里面元素每个位置的元素相同被认定为相同。...原创 2021-01-10 21:56:19 · 109 阅读 · 0 评论 -
int可以表示的最大整数为多少?
int是有符号整数,可以表示的最大整数为:二进制表示方法:0111 1111 1111 1111 1111 1111 1111 1111那么他的大小为多少呢?(2^31 -1)这个是怎么算的呢?其实就是正常的算法:1* 2 ^ 0 + 1* 2 ^ 1 +....+1 * 2 ^ 30那么这个其实是一个等比数列:公比为2,首项为1,尾项为2 ^ 30。代入公式可得:(1- 2 ^ 30 * 2)/-1 = 2 ^ 31 -1...原创 2021-01-03 15:02:42 · 6414 阅读 · 0 评论 -
static关键字和重复定义的区别
1、static关键字的问题a.h#pragma once#include <stdio.h>static int a = 5;//a = 10;void print();a.c#include "gloal.h"#include "stdio.h"void print(){ printf("fffff %d\r\n", a);}main.c#include <stdio.h>#include "gloal.h"int main(i原创 2020-12-23 13:41:53 · 1114 阅读 · 0 评论 -
引用计数初识
#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;class WXTString{public: friend ostream & operator<<(ostream &, const WXTString &); struct StringValue { public: int refCount; char* data; public:原创 2020-12-05 22:33:21 · 56 阅读 · 0 评论 -
Qt安装时间过滤器实现窗口点击事件
头文件重载过滤事件函数protected: bool eventFilter(QObject *obj, QEvent *event);//安装事件过滤器ui->textBrowser_22->viewport()->installEventFilter(this);//安装事件过滤器ui->textEdit_3->viewport()->installEventFilter(this);//重载事件过滤器函数原型bool Widget2:原创 2020-11-26 13:40:36 · 362 阅读 · 0 评论 -
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 评论 -
写的一个linux客户端操作cmp
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <arpa/inet.h>#include <signal.h>#include <errno.h>#define IPV4(a,b,c,d) ((a<<0)|(b<&原创 2020-09-24 20:32:57 · 117 阅读 · 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 评论 -
环形队列(索引从0开始(C语言、C++、Java)、索引从1开始(Matlab))
环形队列综合分析0索引开始的代码实现(C++)从1索引开始的代码实现(Matlab)综合分析关于数组模拟环形队列的问题,有两点疑问。为什么用数组模拟?为什么要有环形队列?刚开始想用数组模拟队列,因为数组索引方便,使用简单。但是数组模拟队列有几点局限性。数组是一个定长的类型,即一经分配,无法修改长度。但是我们在使用队列的时候,可能需要很多个数据,那么对于队列的长度选取就存在着问题。因此,聪明的人们开始想着用环形队列进行代替,即环岛一样,可以重复利用多余的空间。那么在使用数组进行环形队列模拟原创 2020-08-27 20:47:54 · 948 阅读 · 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 评论 -
剑指offer第17题判断是否是子树(递归回溯的应用)
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 热度指数:790003 本题知识点: 二叉树 树算法知识视频讲解题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)树的结点:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), r.原创 2020-08-24 15:15:50 · 85 阅读 · 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 评论 -
动态规划算法之0-1背包、完全背包、重复背包问题分析
0-1背包问题假设现在有三件物品:吉他、音响、电脑。其重量分别为1Kg、4Kg、3Kg其价格是:1500、3000、2000(元)0、1背包问题的解决问题是:(填表之后)可以得出状态转移方程式:(1)第一行和第一列的值为零(2)W[i] > j 时,V[i] [j] = V[i-1] [j](3)...原创 2020-08-21 13:43:00 · 1638 阅读 · 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 评论 -
C++中multimap函数equal_range的用法
首先,我们要清楚map 和 multimap都底层都是红黑树,其数据插入进去的时候就已经是有序的了。multimap可以插入相同的键,因此就存在一个问题,我们如何知道插入了多少个相同的元素呢?那么,下面的函数就派上用场了。equal_range()函数主要是求在multimap中有多少个重复的数。比如:可以看出该函数返回值是两个迭Map类型的迭代器,分别指向该元素的起始位置和该元素结束位置的下一个元素的位置。#include <iostream>#include <map>原创 2020-07-07 21:47:58 · 6205 阅读 · 1 评论