![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c/c++数据结构与算法
c/c++数据结构与算法
MarkeyL
网络行业某产品部门开发,日常工作内容涉及嵌入式网络设备SSLVPN,国密,数字证书等模块.
同时也做一些SDWAN体系中集中管理平台的开发工作,也会经常和java打交道.
21年有跨平台图形客户端相关的工作内容,又开始接触C++和QT,以及qml.
展开
-
使用按位与运算(&)巧妙实现求模运算(%)
static int indexFor(int h, int length) { return h & (length-1);}我们在进行hash相关的计算操作时,经常会涉及到求模运算,如上面的算哈希映射位置的代码。前提:length是一个2的幂次方整数,这样,length-1 的二进制就是一个形如“0000111…”的数,比如,如果length=4,length-1=3,其二进制表示为“0011”,如果length=8,length-1=7,其二进制表示为“0111”,以此类推。将h原创 2022-03-10 15:44:17 · 511 阅读 · 0 评论 -
const char * 、char const *、 char * const 三者的区别
const char * ptr 等价于 char const * ptr定义一个指向const char的指针。不能通过ptr来修改所指向的内容,指针指向的内容不可变,但指针本身可以再赋值char * const ptr定义一个指向char的指针常数。即const指针,不能修改ptr指针,但是可以修改该指针指向的内容。...原创 2022-02-08 17:09:52 · 452 阅读 · 0 评论 -
#program once 和 #ifndef
#program once 和 #ifndef在写小demo的时候,注意到vs中会自动生成#program once;看别人写的代码的时候见到比较多的反而是#ifndef—#define—#endif;从字面上看两种方式会产生相同的效果:避免同一个文件重复包含多次,但知道两种方式的本质还是有必要的。#program once:“同一个文件”指存储在相同位置的文件,即物理位置下相同;当编译器意识到文件存储位置向同事便会跳过“副本文件”,仅仅编译一次该物理位置的文件;但如果发生拷贝情况,便会出现重复包含的情转载 2022-01-29 14:00:36 · 4757 阅读 · 2 评论 -
Visual Studio快捷键
编译&运行&调试Ctrl + F7 编译F5 运行Shift + F5 停止调试Ctrl + F5 运行(不调试)F9 下断点F10 单步步过F11 单步步入监视窗口 err,hr 显示错误码和错误说明。(或 工具——错误查找,手动输入错误码查找)编码创建函数声明/定义。(函数名右键——快速操作和重构——创建声明/定义)F12 跳转到定义Ctrl + F12 跳转到声明Alt + 方向键上下 整行移动一行代码...原创 2022-01-29 12:38:07 · 1491 阅读 · 0 评论 -
C——数组指针
为什么px 与*px的地址值是一样的?#include "stdafx.h"int main(int argc, char* argv[]){ int arr[16] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 }; int(*px)[2]; //宽度:4 printf("%d\n", sizeof(px)); //赋值 px = (int(*)[2])arr; printf("%d\n", px); px++; .原创 2022-01-16 17:35:11 · 182 阅读 · 0 评论 -
strcpy及memcpy的内存重叠处理
strcpy和memcpy同是一个类型的函数,但实质上却是不同的,他们的原型分别为:char *strcpy(char *dest, const char *src);void *memcpy(void *dest, const void *src, size_t count);当我们使用这两个函数时都会出现同样一个问题,内存重叠。那么我们就来分析一下内存重叠是如何产的。现在假设有char *d = dest; char *s = src;要复制count = 5个字符,如下图所示:1、第一种转载 2022-01-06 10:16:09 · 1552 阅读 · 0 评论 -
c语言-结构体字节对齐
对齐参数和sizeof()vc6.0编译器默认对其参数为8对齐原则(以对齐参数为8为例)原创 2021-12-22 09:59:39 · 80 阅读 · 0 评论 -
C语言类型长度(int,long,long long)
不同系统下的C语言类型长度绝大部分64位的Unix,linux都是使用的LP64模型;32位Linux系统是ILP32模型;64位的Windows使用的是LLP64(long long and point 64)模型。原创 2021-12-21 16:38:49 · 1126 阅读 · 0 评论 -
计算机计算2+3=?的详细过程
假设2存到了X中,3存到了Y中;X:0010Y:0011 0010 0011xor-------------------原创 2021-11-08 11:33:50 · 980 阅读 · 0 评论 -
c++实现树的dfs,bfs
void dfs(Node* head) { if (head == nullptr) { return; } std::cout << head->value << ","; dfs(head->left); dfs(head->right);}void bfs(Node* head) { if (head == nullptr) { // if head is nullptr, return原创 2021-08-19 00:35:31 · 225 阅读 · 0 评论 -
c/c++——判断一个字符串是否为合法IP地址(包括IPV4和IPV6)
#include <iostream>#include <algorithm>using namespace std;class Solution{public: string validIPAddress(string IP) { //以.和:来区分ipv4和ipv6 for (int i = 0; i < IP.length(); i++) { if (IP[i] == '.原创 2021-08-18 22:05:15 · 3358 阅读 · 1 评论 -
itoa的简单实现
itoa——数值转字符串char* itoa(int num, char* buf){ int i =0; int len = 0; char tmp; while (num) { buf[i++] = num %10 +'0'; num = num /10; } buf[i] = '\0'; return buf; len = i; for (i=0;i<len/2;i++).原创 2021-08-18 21:36:41 · 1194 阅读 · 0 评论 -
atoi的简易实现
atoi() ——字符串转数字//暂时仅考虑了十进制和十六进制int atoi(const char * buf){ int value =0; int base = 10; int i =0; if (buf[0] == '0' && buf[1] =='x') { base = 16; i = 2; } while (buf[i]) { int tmp; .原创 2021-08-18 21:20:46 · 112 阅读 · 0 评论 -
动态规划-01背包问题
优化成一维数组为什么内层循环一定要倒叙?假设我们从0开始增加,背包容量为10,第一个物品重量为2,价值为5.第一次实际放置:f[2] = max{f[2],f[2-2]+5} = 5;继续循环,会发现第一个物品会被重复放置!f[4] = max{f[4],f[4-2]+5} = f[2] +5 = 10 (X)等价到二维数组的情况,相当于在第i层循环时,理论上是只能使用第i-1层的数据的,此时却使用了第i层计算出的数据,显然是有问题的.而内层如果从后往前循环,可以保证每次放置时,相对与前原创 2021-08-17 15:01:43 · 60 阅读 · 0 评论 -
c++-往字符串前面补想要个数的0
int wanna_length = 20;string ss1(wnanna_length - s1.length(), '0');s1 = ss1 + s1;原创 2021-07-21 17:18:58 · 2428 阅读 · 0 评论 -
c/c++-辗转相除求最大公约数
int gcd(int a, int b){ return b == 0 ? a : gcd(b, a % b);}原创 2021-07-16 14:43:45 · 138 阅读 · 0 评论 -
c++获取输入时cin,getchar(),getline()
今天刷PAT乙级题目[1044 火星数字]这道题目时发现每次输出的开头都会多打一个0.单步发现每次处理的第一个s字符串是一个未知的空串,查了半天发现是第一行cin>>n之后,之间调用getline()的话获取到的是缓冲区里第一行之后的换行符…,所以需要额外调用下getchar(), 具体代码如下,记录下:cin >> n;getchar();for (int i = 0; i < n;i++){ getline(cin, s); ....}参考了原创 2021-07-12 15:25:05 · 223 阅读 · 0 评论 -
数据结构与算法-图
数据结构与算法-图图的基本概念顶点集V和边集E.| V | : 顶点和边的数目. | E | : 边的数目.无向图 : (v,w)或(w,v)有向图 : <v,w>简单图 : ①不存在顶点到自身的边 ②不存在重复边.多重图.顶点的度 :对于无向图,指的是依附与该定点的边的条数,称为TD(v); 总TD = 2e对于有向图,入度为以顶点v为终点的有向边束缚,记为ID(Vi);出度为以顶点v为起点的有向边束缚,记为从OD(Vi);顶点v的度为入度和出度之和,记为TD(v) =原创 2021-06-30 19:43:30 · 93 阅读 · 0 评论 -
数据结构与算法-树与二叉树
数据结构与算法-树与二叉树二叉树的后序遍历-非递归实现方法一为了保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存 在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。Tips:判断当前节点的左右节点是否被访问过时不能仅仅考虑右节点是否已被访问原创 2021-06-21 16:33:17 · 86 阅读 · 0 评论 -
数据结构与算法-栈和队列
数据结构与算法-栈和队列栈的定义-栈(Stack)是只允许在一端进行插入或删除操作的线性表.栈顶:允许插入和删除的一端栈底:不允许插入和删除的一端特点:后进先出 Last In First Out (LIFO)基本操作//创建,销毁InitStack(&S); //初始化栈。构造一个空栈 S,分配内存空间。DestroyStack(&S); //销毁栈。销毁并释放栈 S 所占用的内存空间。//增删Push(&S,x); //进栈,若栈S未满,则将x加入原创 2021-06-20 18:33:40 · 1130 阅读 · 0 评论 -
数据结构与算法-三对角矩阵的压缩公式推导
数据结构与算法-三对角矩阵的压缩公式推导三对角矩阵压缩公式推导(1)考虑a[i,j]处在第2到第n-1行之间:我们可以看到,从第二行开始,元素的个数都为3个。对于a[i,j]将要存储的数组下标k,首先前(i-1)行元素的个数是(i-2)*3 +2(i-2减去的是第一行和自己这行;第一行元素的个数为2),又a[i,j]属于第i行所有元素的第j-i+2个元素(随便找一行j-i看下就能得到),所以k= (i-2)*3 +2 + j-i+2-1 = 2i+j-3(注意数组下标为元素位序-1).(2)特原创 2021-06-11 18:32:17 · 8470 阅读 · 1 评论 -
数据结构和算法-线性表
数据结构和算法-线性表定义(Linear List)线性表是具有相同数据类型的n(n>=0)个数据元素的有序序列.顺序存储: 顺序表链式存储: 单链表,双链表,循环链表,静态链表(数组实现)Notes:(1) 表中元素有限(2) 逻辑上的顺序性(3) 表中数据元素的类型都相同,每个元素都战友相同大小的存储空间.(4)线性表是一种逻辑结构;顺序表和链表是值存储结构.线性表的基本操作InitList(&L); //构造一个空的线性表。成功返回0出错返回-1Length(L原创 2021-06-08 22:20:17 · 392 阅读 · 0 评论 -
数据结构与算法-绪论
数据结构与算法-绪论数据结构的基本概念数据元素、数据项: 数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。 一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。数据对象:是具有相同性质的数据元素的集合,是数据的一个子集。数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。举例:(1)人就是数据的基本单位数据元素。(2)此时姓名,年龄,身高,体重,身价等就可以理解为数据项。(3)每个人都具有以上的性质和属性,他们就都属于同一个数据对象。(4)人与原创 2021-06-04 03:26:36 · 365 阅读 · 0 评论