C++
文章平均质量分 57
qq_37032670
这个作者很懒,什么都没留下…
展开
-
C语言中int *p[n]和int (*p)[n]的区别
int *p[n] 分析:分析这个问题要先从字符优先级开始,在字符优先级表中,[]的优先级大于*,所以,int *p[n] 就等价于int *(p[n]),这样就清晰多了,再进化一下就是 (int *)(p[n]) ,这样就完整了,显然,(int *)(p[n]) 就是一个数组,是一个以n个整型地址为元素,数组名为p的数组;举个例子:#include <stdio.h>void main(){ int a=1,b=2,c=3,d=4; int *p[4] = {&a转载 2020-09-26 15:17:30 · 354 阅读 · 0 评论 -
C++字符串
char s1[] = "abc", s2[] = "abc"; const char s3[] = "abc", s4[] = "abc", *s5 = "abc", *s6 = "abc"; string s7("abc"), s8("abc"); cout << (s3 == s4) << " " << (s5 == s6) << " " << (s7 == s8) << " " << (s1 == s2) ..原创 2020-09-26 00:03:30 · 101 阅读 · 0 评论 -
C/C++内存四区
内存模型图32位CPU可寻址4G线性空间,每个进程都有各自独立的4G逻辑地址,其中0~3G是用户态空间,3~4G是内核空间,不同进程相同的逻辑地址会映射到不同的物理地址中。其逻辑地址其划分如下:各个段说明如下:3G用户空间和1G内核空间静态区域:text segment(代码段):包括只读存储区和文本区,其中只读存储区存储字符串常量,文本区存储程序的机器代码。data segment(数据段):存储程序中已初始化的全局变量和静态变量bss segment(BSS段):存储未初转载 2020-09-21 17:00:48 · 158 阅读 · 0 评论 -
关于lower_bound( )和upper_bound( )的常见用法
ower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。在从小到大的排序数组中,lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,转载 2020-09-20 23:13:32 · 396 阅读 · 0 评论 -
[c++11]我理解的右值引用、移动语义和完美转发
c++中引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能。有点难理解,于是花时间整理一下自己的理解。左值、右值C++中所有的值都必然属于左值、右值二者之一。左值是指表达式结束后依然存在的持久化对象,右值是指表达式结束时就不再存在的临时对象。所有的具名变量或者对象都是左值,而右值不具名。很难得到左值和右值的真正定义,但是有一个可以区分左值和右值的便捷方法:看能不能对表达式取地址,如果能,则为左值,否则为右值。看见书上又将右值分为将亡值和纯右值。纯右值就是c++98标准中右值的概念,如非引转载 2020-09-15 16:38:09 · 143 阅读 · 0 评论 -
nullptr与NULL的区别
前言在C语言中,我们常常用NULL作为指针变量的初始值,而在C++中,却不建议你这么做。NULL是什么在《NULL,0,'\0',"0","\0"的区别》一文中,我们已经知道了在C中NULL是什么,在C的头文件中,通常定义如下:#define NULL ((void*)0)但是在C++中,它是这样定义的:#define NULL 0或者你可以在stddef.h看到完整的这段:#undef NULL#if defined(__cplusplus)#define NUL转载 2020-08-19 16:04:16 · 8435 阅读 · 2 评论 -
STL 堆
1.priority_queuepriority_queue默认是最大堆,要用最小堆需要比较函数greater<int>priority_queue<int, vector<int>, less<int>> maxHeap;priority_queue<int, vector<int>, greater<int>> minHeap;也可以自定义比较函数struct cmp{ bool ope原创 2020-08-10 13:36:26 · 220 阅读 · 0 评论 -
c++ 字符串常量
字符串常量。之所以称之为常量,是因为它可看作是一个没有命名的字符串且为常量,存放在静态数据区。这里说的静态数据区,是相对于堆、栈等动态数据区而言的。静态数据区存放的是全局变量和静态变量。从这一点上来说,字符串常量又能够称之为一个无名的静态变量。由于"Hello world!"这个字符串在函数 s1和s2 中都引用了。但在内存中却仅仅有一份拷贝,这与静态变量性质相当神似。char *c="chenxi";书上说: "chenxi"这个字符串被当作常量并且被放置在此程序的内存静态区。全部的字符窜常原创 2020-08-04 19:58:53 · 4358 阅读 · 2 评论 -
C++ 输出不使用科学计数法
#include <iostream>#include <iomanip>using namespace std;int main(){ //强制使用小数,防止使用科学计数法 cout << fixed; //控制显示的精度,控制小数点后面的位数。而整数太大时也会使用科学计数法,要输出完整的整数时就可以将下面改成setprecision(0) cout << setprecision(7); double Do.原创 2020-08-02 14:38:22 · 12399 阅读 · 1 评论 -
vector.size()返回值问题
刷80. 删除排序数组中的重复项 II时,所写代码如下:-原创 2020-07-30 17:45:50 · 4020 阅读 · 0 评论 -
C++类继承中的构造函数和析构函数 调用顺序
在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承)建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推;析构对象时,其顺序正好与构造相反; if(子类没有自定义构造函数){ if(基类没有自定义构造函数) { 用子类定义对象时,先自动调用基类的默认...原创 2018-09-02 17:16:28 · 1500 阅读 · 0 评论 -
new一个二维数组
定义二维数组char array[x][y]; 1.只定义个一维的就可以了 char *array; array = new char[x*y]; 访问的时候*(array+i*y+j)表示array[i][j] 2.定义一个二维数组 char **array1 array1 = new char *[x]; for(i=0;i<x;++i) array1[i] = new char[y];...原创 2018-03-09 01:06:33 · 837 阅读 · 0 评论 -
环形打印矩阵
法一:#include#includeint main(){ printf("请输入矩阵的阶数(小于0则退出):\n"); int n; scanf("%d",&n); while(n>0) { std::vectorv(n*n); //d=0:right;d=1:down;d=2:left;d=3:up for(int col=n,row=n,i=1,loc=0,d=0,j;i原创 2017-08-15 17:42:35 · 767 阅读 · 0 评论 -
C++类构造函数初始化列表
定义一个类Person:Class Person{public: Person():name(NULL){} Person(const char*str,,const double*pd,int n):name(str),scores(pd,n){}private: string name; valarray<double> scores;...原创 2017-07-26 11:09:32 · 293 阅读 · 0 评论 -
Hash算法冲突解决方法分析
原文地址:http://blog.csdn.net/willfcareer/article/details/6687117就不自己写了,直接贴下吧看了ConcurrentHashMap的实现, 使用的是拉链法.虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的。当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时。冲突就难免会发 生。另外,当关转载 2017-08-17 20:37:58 · 126 阅读 · 0 评论 -
char*,const char*和string 三者转换
1. const char* 和string 转换(1) const char*转换为 string,直接赋值即可。 EX: const char* tmp = "tsinghua". string s = tmp;(2) string转换为const char*,利用c_str() EX: string s = "ts原创 2016-12-14 01:41:18 · 1003 阅读 · 0 评论 -
C++中const在函数名前面和函数后面的区别
一、概念 当const在函数名前面的时候修饰的是函数返回值,在函数名后面表示是常成员函数,该函数不能修改对象内的任何成员,只能发生读操作,不能发生写操作。二、原理: 我们都知道在调用成员函数的时候编译器会将对象自身的地址作为隐藏参数传递给函数,在const成员函数中,既不能改变this所指向的对象,也不能改变this所保存的地址,this的类型是一个指向cons转载 2017-08-14 11:02:12 · 310 阅读 · 0 评论 -
STL——set与hash_set
在STL中,set是以红黑树(RB-tree)作为底层数据结构的,hash_set是以Hash table(哈希表)作为底层数据结构的。set可以在时间复杂度为O(logN)情况下插入、删除和查找数据。hash_set操作的时间复杂度则比较复杂,这取决于哈希函数和哈希表的负载情况。set和hash_set的常用函数如下所示:1.set中的元素会自动排序,因此插入数据时,如果给定的位原创 2017-08-14 10:15:54 · 371 阅读 · 0 评论 -
指定数字的输出位数
想要指定数字的输出位数,比如想显示时间:01:02,想要输出为两位数字,实现方式如下:CString strTemp; int i = 1; int j = 2; strTemp.Format("%02d:%02d", i, j);输出01:02.%02d中2为转换位数。指定2位。0为填充字符。当位数不足2位时,以0填充。原创 2017-08-15 10:12:11 · 403 阅读 · 0 评论 -
静态变量、全局变量和局部变量
原文地址:http://www.cnblogs.com/King-Gentleman/p/5350563.html1.从作用域看:C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。1>全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文转载 2017-08-22 16:29:04 · 207 阅读 · 0 评论 -
今天才发现printf不能直接输出string类型
原文地址:http://blog.csdn.net/spaceyqy/article/details/24840215近期研究设计模式,在程序输出时心血来潮用了c版本的printf,结果就蛋疼了,一直输出是乱码, string s = "中国";printf("%s" , s);//输出乱码果断切换成c++版本的cout发现可以正常输出。于是上网找答案转载 2017-08-23 14:44:40 · 4027 阅读 · 1 评论 -
C++find函数
头文件#include 函数实现templateInputIterator find (InputIterator first, InputIterator last, const T& val){ while (first!=last) { if (*first==val) return first; ++first; }转载 2017-08-28 10:26:47 · 617 阅读 · 0 评论 -
C++中,get和getline函数的区别
原文地址:http://blog.csdn.net/suyin1993/article/details/48932885cin.getline()和cin.get()都是对输入的面向行的读取,即一次读取整行而不是单个数字或字符,但是二者有一定的区别。 cin.get()每次读取一整行并把由Enter键生成的换行符留在输入队列中,比如:#include using namespac转载 2017-08-24 08:59:18 · 445 阅读 · 0 评论 -
reverse函数
挺好用的一个函数,可以反转string、数组、容器等数据类型,cplusplus说头文件是algorithm,然而我试了并不需要任何头文件,只需要using namespace std;或者std::reverse反转string:#include#includeusing namespace std;int main(){ string s="abcdef"; cou原创 2017-08-24 09:39:58 · 1267 阅读 · 0 评论 -
i++与++i的效率比较
原文地址:http://blog.csdn.net/oktears/article/details/19416609,http://blog.csdn.net/debugconsole/article/details/8058605解析:在这里声明,简单的比较前缀自增运算符和后缀自增运算符的效率是片面的,因为存在很多因素影响这个问题的答案。首先考虑内建数据类型的情况:如果自增运算表达式的结转载 2017-08-29 09:16:42 · 513 阅读 · 0 评论 -
不用中间变量交换两个数
inline void Swap1(int &a, int &b) { if (a != b) { a ^= b; b ^= a; a ^= b; } } 判断不能漏,因为如果a, b指向的是同一个数,那么调用Swap1()函数会使这个数为0(第一步a^=b导致a=0,b和a为同一个值得引用所以原创 2017-08-01 20:33:58 · 178 阅读 · 0 评论