c++
mazamu
沉迷学习无法自拔。
展开
-
sizeof结构体的大小
sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和!\n结构体的大小跟结构体成员对齐有密切关系,而并非简单地等于各个成员的大小之和!比如对如下结构体两个结构体A、B使用sizeof的结果分别是:16,24。可以看出sizeof(B)并不等于sizeof(int)+sizeof(double)+sizeof(int)=16。\n\nstruct A{\n int num1;\n\n  原创 2022-10-17 17:59:53 · 318 阅读 · 0 评论 -
union判断大小端
union { char a; int b;}c;int main(){ c.b = 1; printf("%d",c.a == 1); return 0;}如果是小端则结果是1大端结果是0原创 2021-10-27 15:44:14 · 385 阅读 · 0 评论 -
C++11新特性简略速览
1.引入nullptr改进NULL,隐式推导返回类型(专门用来区分空指针和0)2.自动类型推导auto和decltypeauto x = 1;auto y = 2;decltype(x + y) z;3.基于范围的for循环vector<int>ar({1,2,3,4,5,6});for(auto i : ar) { cout<<i;}或for(auto &i : ar) { i = 10; cout<<i;}4.智能指针sh原创 2021-10-20 20:32:16 · 134 阅读 · 0 评论 -
Linux下使用C++连接MySQL8.0(即Connector/C++ 8.0)
正确安装MySQL8.0参考这篇成功安装MySQL8.0安装boost库sudo apt-get install libboost-all-dev安装 C++Connector 库https://dev.mysql.com/downloads/connector/cpp/我用的是上面的前三个包,dpkg -i 文件名.deb注意-dev包最后一个安装MakefileMYSQL_CONCPP_DIR= /usrCPPFLAGS = -I $(MYSQL_CONCPP_DIR)/i原创 2021-10-09 19:20:32 · 1919 阅读 · 0 评论 -
链表实现大整数 加减法 一个节点保存四位数字(C++实现)
可用来熟悉数据结构与C++语言内容。#include<iostream>#include<vector>#include<algorithm>using namespace std;class node {public: node() { ch = ""; next = nullptr; } node(string a) { ch = a; next = nullptr;原创 2021-09-16 19:54:44 · 395 阅读 · 0 评论 -
C++内存池实现
class Airplane{private: struct AirpRef { unsigned long miles; char type; };private: union { AirpRef rep; Airplane *next; };public: static void *operator new(size_t sizes) { if(sizes != sizeof(A原创 2021-09-15 16:34:06 · 142 阅读 · 0 评论 -
C++小型内存池实现
class Foo {public: Foo(int x) : id(x) {} int getId() {return id;} ~Foo() {} void *operator new(size_t sizes) { Foo *p; if(!freeStore) { //linkList is empty size_t num = FooNum * sizes; f原创 2021-09-15 15:51:26 · 107 阅读 · 0 评论 -
我的C++not1
template<typename Predicate>class my_unary_negate : public unary_function<typename Predicate::argument_type,typename Predicate::result_type> {protected: Predicate pred;public: my_unary_negate(const Predicate &x) : pred(x) {}原创 2021-09-14 10:17:53 · 107 阅读 · 0 评论 -
C++unary_function和binary_funtion
unary_funtionunary_funtion的结构如下:template<typename Arg,typename Result>class unary_funtion{ typedef Arg argument_type; typedef Result result_type;};一般单元操作符都应该继承此类。binary_funtionbinary_funtion结构如下:template<typename Arg1,typename Arg2,type原创 2021-09-14 08:28:25 · 216 阅读 · 0 评论 -
我的C++bind2nd
原版C++bind2nd我的C++bind2nd主要是为了理解C++的仿函数:template<typename Operation>class mybinder2nd : public unary_function<typename Operation::first_argument_type,typename Operation::result_type> {protected: Operation op; typename Operation::sec原创 2021-09-13 23:22:59 · 216 阅读 · 0 评论 -
设计模式----AbstructFactory模式(简单C++实现)
Abstruct PatternAbstructProduct.h#ifndef _ABSTRUCTPRODUCT_H_#define _ABSTRUCTPRODUCT_H_class abstructproductA {public: virtual ~abstructproductA();protected: abstructproductA();private:};class abstructproductB {public: virtual ~a原创 2021-09-13 09:41:04 · 182 阅读 · 0 评论 -
设计模式----factory模式(简单C++实现)
factory模式的两个功能定义创建对象的接口,封装对象的创建使得具体化类的工作延迟到子类中上图的意思是product是基类,concreteProduct1和concreteProduct2是派生类,我们在使用时一般会以基类指针指向实际对象来初始化,但是当派生类过多时会记不住派生类的名字(即一般会需要new xxx,难记xxx)所以需要工厂模式,用concreteFactory来产生相应的product。以下的代码主要实现上图,product#ifndef _PRODUCT_H_#def原创 2021-09-13 00:05:04 · 332 阅读 · 0 评论 -
linux中进程和线程的区别(fork和pthread_create的区别)
linux中进程和线程的区别在linux中两者区别不大,底层都是通过clone函数来创建,只是参数不同,先上一个clone()参数标志:pthread_create使用的clone是:clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,0)fork使用的clone是:clone(SIGCHLD,0)vfork使用的clone是:clone(CLONE_VFORK | CLONE_VM | SIGCHLD,0)区别只是在于clone参数原创 2021-09-02 23:17:00 · 2521 阅读 · 0 评论 -
C++中多态-面试回答
谈谈你了解的多态多态就是:同样的调用语句有不同的表现形态。即一般根据基类指针指向的实际对象,调用相应的同名函数。多态的条件1.必须有继承2.基类中必须用virtual关键字声明函数,即重写虚函数3.用基类指针指向对象虚函数相关基类中,在函数名前用virtual关键字声明,在派生类中再次实现同名函数(函数参数类型、个数,返回值类型必须一样)。在编译时,编译器遇到virtual关键字会在常量区创建一个虚函数表(存的是相应函数的指针),每一个类都有一个虚函数表,每一个对象都有一个指向虚函数表的原创 2021-09-01 21:38:13 · 219 阅读 · 0 评论 -
C++中左值引用和右值引用详解
C++中左值引用和右值引用C++通过引入右值引用来优化性能,具体来说是通过移动语义来避免无谓的拷贝问题,通过move语义来将临时生成的左值中的资源无代价地转移到另外一个对象去。1.C++中所有值必然属于左值或者右值,在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值。举个例子:int u = a + b,其中u就是左值,其变量名是u,可以通过&u来获取变量的地址;表达式a + b的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(a原创 2021-08-30 22:32:18 · 1591 阅读 · 0 评论 -
静态库和动态库的区别
静态库和动态库的区别区别在于:该库是否被编译进目标(程序)内部。分别介绍静态函数库这类库在编译的时候会直接整合到目标代码中,所以形成的文件比较大,优点是编译成功之后的可执行文件可以独立运行,不需要向外部读取函数库。动态函数库动态函数库在编译时,只有一个 指向 的位置,也就是说可执行文件需要用到函数库的机制时,才会去读取函数库的内容来使用,也就是说可执行文件无法单独执行。优点是便于升级,需要时只要替换相应的动态库即可,不必编译整个文件。...原创 2021-08-30 20:49:05 · 255 阅读 · 0 评论 -
大学三年来收藏的14个可以写上简历的C/C++项目【已分类】
我本人就是C++后台开发方向,在学习的过程中也陆陆续续收集了一些比较适合新手写上简历的C++项目。因为C++不像Java那样偏应用,C++偏底层,所以需要我们有比较好的计算机基础,比如计算机网络、操作系统、数据结构与算法、数据库。C++方向计算机网络相关项目写一个Json库写一个WebServer写一个网络库写一个服务器框架操作系统相关写一个操作系统内核写一个线程库写一个线程池写一个用户态线程写一个高并发内存池数据结构与算法相关写一个STL写一个红黑树数据库相关写一个NoSQL写一个跳表原创 2021-08-24 22:41:18 · 18055 阅读 · 3 评论 -
C++STL中的数据结构
C++STL中的数据结构STL中的数据结构有两种分类方法。一种是分为容器和适配器,另一种是序列结构和非序列结构。容器和适配器STL容器有vector、list、rbtree、deque。适配器有:stack、queue、map、set、priority_queue、unordered_map、unordered_set。适配器封装了哪些容器:stack(deque)queue(deque)map(rbtree)set(rbtree)priority_queue(vector)unord原创 2021-08-27 18:33:01 · 472 阅读 · 0 评论 -
了解多态吗?虚函数底层?虚函数表是每个对象有一份还是每个对象有一份?虚函数表存放在哪个位置?
多态多态就是在函数前面加上virtual关键字,然后在派生类中重写该函数。运行时,会根据基类指针指向的对象的实际类型来调用相应的函数。类中声明virtual的话,编译器会自动生成虚表,每个类中都有一个虚表(一维数组)。每个对象都有一个指向虚表的指针(对象地址的前四个字节就是指向虚表的指针)。虚表存的是虚函数地址。析构函数必须声明为虚函数,因为删除该类指针时,需要调用相应的虚构函数,如果没有声明,则删除基类指针只会调用基类的析构函数,派生类的析构函数没有被调用,则造成内存泄漏。虚函数表存放在常量区。原创 2021-08-24 21:13:14 · 951 阅读 · 0 评论 -
C++中关于红黑树,set,map
原谅以下截图的高糊画质。。。set,map和multiset,multimap区别不大,除非特别声明,否则指的是两者。红黑树红黑树需要传递五个模板参数进去,分别是key,value(key和data的集合),函数模板(从value中找到key),比较方法,空间配置器,以下将是区分set和multiset,map和multimap的函数,set和map用的是insert_unique(),multiset和multimap用的是insert_equal(),前者表示插入的key是独一无二的,后者表示可原创 2021-08-13 20:51:37 · 260 阅读 · 0 评论 -
编写c语言程序判断大小端
void run() { unsigned int c[] = {0x12345678,0x77777777}; int n = 32; string ans = ""; for(int i = 0; i < 2; i++) { ans = ""; cout<<(&c + i)<<":"; n = 32; while(n--) { ans = char('0' + (c[i] & 0x1)) + ans; .原创 2021-08-11 21:30:13 · 136 阅读 · 0 评论 -
c++中string里面的size()和length()
二者没有区别返回值都是字符长度,不存在区别,但要注意与size_of这个运算符以及 strlen() 这个函数做对比。string str="123456";cout <<"str.length()="<<str.length()<<endl; //结果为7cout <<"str.size()="<<str.size()<<endl; //结果为7strle原创 2021-08-05 23:25:58 · 4363 阅读 · 1 评论 -
基于信号 实现多进程并发服务器
服务器端:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <signal.h>#include <sys/wait.h>#include <string.h>#include <arpa/inet.h>#include <sys/socket.h>#define BUFF 30void errors(char原创 2021-07-14 22:40:20 · 94 阅读 · 0 评论 -
面试题之-值传递、指针传递、引用传递的区别
本文需要汇编相关知识。用代码来解释:主函数的反汇编:如图,main函数的主要内容从8048485开始,eax寄存器里的值是10,分别把eax压栈,并调用fun1、fun2、fun3函数。fun1:将b压栈(b的复制)进入到fun1函数后,把这个压栈后的数减一,然后返回原来的函数,无别的操作。栈中的内容是b的复制,进入函数后,改变b的复制,对b并没有影响。上面不理解,可以等看完fun2再回来看。fun2:将压栈内容(b的别名)放入eax,得到eax指向的内容(值)放入eax,将原创 2021-06-28 23:42:10 · 170 阅读 · 0 评论 -
整合---char与int互转,string与int互转
文章目录char与int互转char转intint转charstring与int互转string转intint转stringchar与int互转char转int如下: char c = '1'; int x = c - '0'; int x1 = int(c - '0');看内存:int main(){ char c = '1'; int x = c - '0'; int x1 = int(c - '0'); cout<<c<<原创 2021-05-31 09:40:34 · 260 阅读 · 0 评论 -
并查集板子-带注释-c/c++
#include<iostream>using namespace std;int n = 20005;int father[20005];// 并查集初始化void init() { for (int i = 0; i < n; ++i) { father[i] = i; }}// 并查集里寻根的过程int find(int u) { return u == father[u] ? u : father[u] = find(fat原创 2021-01-15 19:56:21 · 300 阅读 · 0 评论 -
希尔排序-小白级讲解-代码+练习题
希尔排序算法描述:希尔排序是插入排序的一种改进,主要是为了解决当较小的数据大都出现在数组后面时导致的移动次数明显增多的问题,思想是使用一个不断缩小的增量gap将数组元素分组,在每个分组内部先进行插入排序,当gap减少到1时整个数组元素分在一组,最后进行一次插入排序,整个排序过程结束。算法时间复杂度:最好情况:当数据已经排好序的情况下:O(N1.3);最坏情况:O(N2);平均情况:O(NlogN)算法空间复杂度:O(1)算法稳定性:不稳定算法实现:希尔排序ShellSort的实现如下:void原创 2020-12-27 17:11:40 · 1462 阅读 · 0 评论 -
strtok函数源码(传入的第一个参数为什么不同)
为什么第一次使用strtok和 接下来每次使用strtok时 第一个参数分别传入 原字符串 和 null 的原因。原创 2020-12-09 22:26:33 · 568 阅读 · 0 评论 -
简单算术表达式二叉树的构建和求值【c/c++】
无图无注释也能懂系列。先处理乘除符号,再处理加减符号,数字只能是叶子节点。思路:用vector<Btree*>存贮每一个字符,然后遍历此数组,进行建树。当建树完成,最后vector内只剩下树的根节点。此代码只适用于数字是 个位数,如果需要处理多位数,拿去修改某些地方就可以了,主要的困难还是在于如何建树。#include<vector>#include<stdio.h>#include<stdlib.h>#include<iostream原创 2020-12-05 21:12:04 · 1206 阅读 · 1 评论 -
大一期末程序课程设计 C/C++实现简单学生学籍管理系统
之前的那次是C++实验课最后一次实验作业 大一期末作业 c/c++实现简单学校人员管理系统,这次是C++课程设计,个人感觉比上一次的简单,因为这次有详细的要求,照着要求实现功能就行。实验结果图:剩下的操作有兴趣的话复制粘贴去试试://Main.cpp#include"ManagerStu.h"int Student::AGE[] = { 0 };int Student::CLNUM[] = { 0 };string Student::DEPART[] = { " " };int原创 2020-07-04 19:54:31 · 6991 阅读 · 1 评论 -
指针小结 学C/C++避不开的这些点
本文要讲的内容如下图:一、函数与指针:这模块分为 指向函数的指针 和 返回指针的函数。1、指向函数的指针(即函数指针):要定义函数指针,首先得清楚函数的类型,函数的类型由:函数的参数 和 返回类型 来区分。例子如下:int Max(double,double);double*Max(double,double,int);第一个式子的 函数参数 为两个double,返回类型 为int,第二个式子的 函数参数 为三个,返回类型 为double*(即指向double型的指针)。函数的参数原创 2020-06-27 15:51:57 · 376 阅读 · 0 评论 -
大一期末作业 c/c++实现简单学校人员管理系统
c/c++实现简单学校人员管理系统动手前列的框架:成品是这样子的:剩下的操作有兴趣的话复制粘贴去试试:代码如下://Main.cpp#include"US.h"int People::sizes = 0;int main(){ US s; s.start(); s.out(); return 0;}Main函数中的US类是用来管理人员以及实现操作的。//US.h#pragma once#include"Student.h"#include"Staff.h"原创 2020-06-22 12:09:27 · 20152 阅读 · 49 评论 -
c++中成员函数和运算符重载细节
今天碰到的问题是用类中同一个成员函数既可以 输出一个值 又可以作为可修改的左值:在这里插入代码片此时22行是错误的,错误显示为a.getValue()不是可修改的左值。想了许久,发现可以这样子改:那么原因是什么呢?...原创 2020-05-21 20:27:35 · 294 阅读 · 0 评论