C/C++
C/C++语言需要注意的地方
卖炫迈的小男孩
随缘记录心得,请多指教~
展开
-
关于创建对象时带括号与不带括号的区别(无参构造函数的调用)
关于创建对象时带括号与不带括号的区别亲自实验后,发现并**不相同**!而以前我没有亲自上机实验就错误的认为“两者相同,都会调用默认构造函数”。其实不然!我翻书查找相关知识,发现《C++面向对象程序涉及第2版》居然有一模一样的问题和解答。(1)在建立对象时不必给出实参的构造函数,称为默认构造函数。显然无参构造函数属于默认构造函数。一个类只能有一个默认构造函数。(2)如果在建立对象时选用的是**无参构造函数**,应该注意书写定义对象的语句。这也恰恰说明了声明的是一个函数而不是定义一个对象,没有调用默认的原创 2020-07-06 16:46:37 · 1371 阅读 · 5 评论 -
C++bool变量与int转换问题只有0才是false!
今天又碰到一个容易让人混淆的问题。就是在C++里,我们int类型直接赋值给bool的变量是0,-1,1,到底哪个是true哪个是false?其他数呢。实践才是检验真理的唯一标准,下面我在devc++上运行如下代码:#include <iostream>#include<cstdio>using namespace std;int main(){ bool x=-1; if(x==true) printf("true\n"); else原创 2020-06-11 11:59:53 · 2907 阅读 · 0 评论 -
sort对类对象进行自定义排序/重载操作符/友元函数/仿函数
c++库函数sort可以自定义排序,**在一般情况下**,我们排序的对象都是普通的数据类型比如:int,double等,排序方式无非就是升序和降序,我们可不写比较函数cmp,我们只需在sort的**第三参数填入**`greater<T>` 或者`less<T>`其中T为模板参数。sort函数原型有两种,实现自定义排序的方法有四种。方法一:重载"<"运算符;方法二:写一个自定义比较的友元函数cmp;方法三:仿函数;普通方法原创 2020-04-16 12:17:30 · 4507 阅读 · 0 评论 -
hash_map、unordered_map和map的效率、区别和分析
hash_map、unordered_map和map的效率、区别和分析一、前言二、三者的实现区别maphash_map和unordered_map三、三者查询效率高低时间效率三者使用选择例题:编译器报错解决方法一、前言最近在做题的时候遇到了,就分享一下自己的心得。hash_map、unordered_map和map的区别其实和hash_set、unordered_set和set的区别是一样的...原创 2020-03-17 22:46:37 · 2688 阅读 · 0 评论 -
C++快速读入法和ios::sync_with_stdio(false);
有时候我们会遇到“由于输入量很大,请使用快速输入法”之类的。输入还要用快速的?是不是把平时我们使用的cin换成scanf?不!还要更快!getchar();读取一个字符的getchar();这个比cin和scanf的读入还要快!直接给出模板:一般情况下把`cin`改成`scanf`都是可以过的,如果希望较小的功夫实现scanf和cin的等效可以在程序开头加一句:`ios::sync_with_stdio(false);`但是需要注意此时`cin`和`scanf`不能混用,否则程序可能会出错。原创 2020-03-07 17:29:21 · 1092 阅读 · 0 评论 -
C/C++历史版本+[Error] range-based 'for' loops are not allowed in C++98 mode解决方法
c/c++版本发展历史,我们在使用c/c++说总会遇到编译错误,明明是支持的正确语法,比如for(auto &a:v)但是就是无法运行,出现这种问题,其实是你的编译器使用的可能是历史久远的C++98,但是现在C++11,C++14都发布并成功使用多年了,我们只需修改一下编译器的编译标准就行了,[Error] range-based 'for' loops are not allowed in C++98 mode这种编译错误就解决了,程序完美运行原创 2019-12-17 22:28:27 · 2753 阅读 · 0 评论 -
c++定义变量时加取址符和不加取址符的区别
函数参数调用有值调用和引用调用。值调用是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参,这一过程是参数值的单向传递过程,一旦形参获得了值便与形参脱离了关系,此后无论形参发生了怎样改变,都不会影响到实参。引用调用作为形参时直接改变的是同一地址中的数据,所以能达到形实结合,对形参的任何操作都会直接作用于实参,即任一个发生变化都会影响到另一个#include<bits/std...原创 2019-11-05 22:10:32 · 2549 阅读 · 3 评论 -
指针的正确使用
指向NULL的指针能不能直接进行操作?这个还得看具体情况,如果你的指针是简单的int或者char指针,那么程序是可以正常运行的。比如;#include<bits/stdc++.h>using namespace std;int main(void){ int *p=NULL; int b; scanf("%d",&b); p=&b; printf(...原创 2019-11-05 21:42:32 · 384 阅读 · 0 评论 -
多测试用例的输入方式
多测试用例并不少见,对于大多数同学来说so easy!但是我觉得这种东西还是要来谈谈,因为我们在敲代码的过程中会遇到各种各样的输入方式,多测试的数组,字符,常数等输入。本文只讨论c和c++的多测试用例输入方式:一.单独一个变量的输入:拿int举例:C:int n;while(scanf("%d",&n)!=EOF){ ……}或者更简洁:(两种等价)int ...原创 2019-09-28 15:18:22 · 2359 阅读 · 0 评论 -
动态内存分配浅谈(new/delete和malloc/free)
[一分钟学会使用new和delete]在c++中我们学过动态分配函数malloc,还有动态储存释放函数free()int* pi = new int(5): 表示动态分配一个int ,初始化为 5int* pa = new int[5]: 表示动态分配一个数组,数组大小为5类似可以定义二维数组。int *B=new int[lb];//创建B数组,长度为lbint *B=(int*)malloc(sizeof(int)*l...原创 2019-09-19 20:01:25 · 196 阅读 · 0 评论 -
邻接表储存图的实现方法
图(有向图和无向图)的储存方法有邻接矩阵和邻接表两种储存方式。其中邻接表有两种实现方式:1.指针。2.数组后者使用比较方便简洁,这里介绍一下用数组实现邻接表储存图输入数据4 51 4 94 3 81 2 52 4 61 3 74表示顶点个数 5表示输入的边数用邻接表储存这个图,代码如下#include&amp;amp;lt;stdio.h&amp;amp;gt;int main(void){ int ...原创 2019-01-28 21:37:43 · 1450 阅读 · 0 评论 -
实现文件读写操作的freopen和fopen区别和使用
引入:https://blog.csdn.net/xavierdarkness/article/details/80638641我们先要在自己的D盘建立一个文件:input文件夹:里面包含:1的文件就是用记事本事先吧你要输入的数据放在那里,我们打开文件夹就是这样的:这个文件里面有我们要输入的数据:67 7 2 0 0 2现在先使用fopen函数打开:#include<b...原创 2019-06-15 23:24:35 · 3232 阅读 · 3 评论 -
C++std容器list遍历为什么可以用迭代器自加++
很多初学list会感到疑惑,都说list物理存储上是不具有逻辑性的,即不能通过iter += i;进行对第i个元素的访问。但是我们能看到以下代码可以运行:一#include <iostream>#include <list>using namespace std;int main(){ list<int> l1; list<int>...原创 2019-08-28 00:08:15 · 1589 阅读 · 0 评论 -
简述类模板函数模板template (typename T)
相信很多刚入门c++的同学在学数据结构或者查看大佬的代码中,我们都会看到:template <typename T>类模板;template<typename T>class A {public: ……protected: ……};或者:函数模板:本文只是简单说明一下我们使用类模板和函数模板需要注意什么(因为我...原创 2019-09-08 15:19:24 · 18512 阅读 · 1 评论 -
rand随机函数和srand初始化种子函数
rand()函数产生的所谓随机数是需要种子(理解为参考,有不同的参考才能产生不同的数)的,srand()正是提供初始化种子的函数,我们要真正的随机函数,就要确保种子每次都是不同的,那么我们把每时每刻都在变化的电脑时间作为种子的话,那么就能通过不断变化的种子来得到不同的函数。如何实现呢?->`srand( (unsigned)time( NULL ) );`( **由于要产生“真随机数列”,因此要用time()函数返回值来做“随机种子”**)原创 2019-09-15 15:19:22 · 6859 阅读 · 0 评论