使用C++刷算法题的简明教程

本文详细介绍使用C++进行算法刷题的优势与技巧,涵盖C++基础语法、STL容器应用及C++11新特性等内容,助你高效提升算法水平。

本篇博客参考自柳婼大神的《从放弃C语言到使用C++刷算法的简明教程》

1.使用C++刷算法的好处

  • 在具备C语言的前提下,学习C++并使用它刷算法题的学习成本非常低,只需要几个小时
  • C++向下兼容C,C语言里的语法大部分都可以在C++文件中运行,所以学习C++对刷算法时编程语言的表达能力进行扩充有益无害,例如C语言的输入输出( scanfprintf )比C++快,那么就可以在使用C++刷算法同时使用 scanf 和 printf 提高代码运行效率
  • C++拥有丰富的STL标准库,这也是PAT、LeetCode等题目中经常需要用到的,单纯使用C语言解决问题会比使用C++的STL库解决问题麻烦很多
  • C++的string非常好用,比C语言里面得到char数组好用很多
  • 在解决一些较为简单的PAT乙级题目的时候( 例如一些时间复杂度限制不严格 ),cin、cout输入输出非常方便

2. 名称空间using namespace std的解释

这句话是使用“std”这个名称空间(namespace)的意思,因为有的时候不同⼚商定义的函数名称彼此之间可能会重复,为了避免冲突,就将所有的函数都封装在各⾃的名称空间里面,使⽤这个函数的时候就在main函数前⾯写明⽤了什么名称空间,几乎在C++中使⽤到的⼀些⽅法如cin、cout都是在std名称空间里面的,所以可以看到using namespace std;这句话几乎成了我每段C++代码的标配,就和return 0; ⼀样必须有。其实也可以不写这句话,但是使⽤std里面的方法的时候就会麻烦点,要写成这样:

#include<iostream>
int main ()
{
   
   
	int n;
	std::cin>>n;
	std::cout<<"hello ,xuyuanzhi"<<n+1<< std::endl;
	return 0;
}

3. cin和cout输入输出

就如同 scanf 和 printf 在 stdio.h 头文件中⼀样,cin 和 cout 在头文件 iostream 里面,看名字就知道,io 是输⼊输出 input和 output的首字母,stream是流,所以这个iostream头文件⾥包含的方法就是管理⼀些输⼊输出流的 cin 和 cout 比较⽅便,不⽤像C语言⾥的scanf、printf 那样写得那样繁琐, cin >> n; 和scanf("%d", &n); 是⼀样的意思,注意cin是向右的箭头,表示将内容输⼊到n中,同样, cout << n;printf("%d", n); ⼀样的意思,此时 cout 是向左的两个箭头,注意和 cin 区分开来。⽽且不管n是 double 还是 int 或者是 char 类型,只⽤写 cin >> n; 和 cout << n; 这样简单的语句就好,不用像C语言中需要根据n的类型对应地写%lf、%d、%c这样麻烦,endl 和 “\n” 是⼀个意思,⼀般如果前⾯是个字符串引号的话直接 “\n” 比较⽅便。
例如:

cout << "hello, ⼩可爱\n";
cout << n << endl;

cin 和 cout 虽然使用起来更⽅便,但是输⼊输出的效率不如 scanf 和 printf 快,如果发现有题目超时了,可以换成 scanf 和 printf 再试一下

4. 关于C++的头文件

C++的头文件⼀般是没有像C语⾔的.h这样的扩展后缀的,⼀般情况下C语言里面的头文件去掉.h,然后在前面加个c就可以继续在C++⽂件中使用c语言头文件中的函数啦
比如:

#include <cmath> // 相当于C语⾔⾥⾯的#include <math.h>
#include <cstdio> // 相当于C语⾔⾥⾯的#include <stdio.h>
#include <cctype> // 相当于C语⾔⾥⾯的#include <ctype.h>
#include <cstring> // 相当于C语⾔⾥⾯的#include <string.h>

5. C++的变量声明

C语言的变量声明⼀般都在函数的开头,但是C++在首次使⽤变量之前声明即可(当然也可以都放在函数的开头),而且⼀般C语言里面会在for循环的外⾯定义i变量,但是C++里面可以在for循环内部定义,而且在for循环里面定义的局部变量,在循环外面就失效啦(就是脱离这个局部作⽤域就会查⽆此变量的意思),所以⼀个main函数里面可以定义好多次局部变量i,再也不⽤担心写的循环太多变量名i、j、k不够⽤啦

#include<iostream>
using namespace std;
int main(){
   
   
	int n;
	cin>>n;
	cout<<"hello,xuyuanzhi"<<n+1<<endl;
	int m;
	cin>>m;
	for(int i=0;i<n;i++){
   
    //这个i只在for循环里面有用,出了这个for循环就失效了
	  cout<<i;	   
	}
	cout<<endl;
	for(int i=0;i<m;i++){
   
   
		cout<<i+2;
	}
	return 0;
}

6. C++特有的bool变量

bool变量有两个值,false 和 true,以前⽤C语言的时候都是用 int 的0和1表示 false 和 true 的,现在C++里面引⼊了这个叫做 bool(布尔)的变量,⽽且C++把所有非零值解释为 true,零值解释为false,所以直接赋值⼀个数字给bool变量也是可以的,它会自动根据int值是不是零来决定给 bool 变量赋值 true 还是 false。

bool flag = true;
bool flag2 = -2; // flag2为true
bool flag3 = 0; // flag3为false

7. C++特有的const定义常量

const int a = 99999999;

8. C++里面超好用的string类

以前C语言中⽤char[]的⽅式处理字符串很繁琐,现在有了string类,定义、拼接、输出、处理都更加简单啦。
不过string只能⽤ cin 和 cout 处理,无法用 scanf 和 printf 处理

    string s="hello c++";//赋值字符串
    string s1=s;
    string s2=s+s1; //字符串拼接直接用+号就可以
    string s3;
    cin>>s3;//读入字符串 
    cout<<s<<endl<<s1<<endl<<s2<<endl<<s3<<endl;//输出字符串 

⽤cin读⼊字符串的时候,是以空格为分隔符的,如果想要读⼊⼀整⾏的字符串,就需要⽤getline,s的长度可以⽤s.length()获取(有几个字符就是⻓度多少,不存在char[]里面的什么末尾的结束符之类的)

   string s;//定义一个空字符串s 
   getline(cin,s);//读取一行的字符串,包括空格 
   cout<<s<<endl;
   cout<<s.length();//输出字符串s的长度 
   return 0;

string中还有个很常⽤的函数叫做substr,作⽤是截取某个字符串中的⼦串,用法有两种形式:

string s2 = s.substr(4); // 表示从下标4开始⼀直到结束
string s3 = s.substr(5, 3); // 表示从下标5开始,3个字符

9. C++的结构体struct和C语言结构体的区别

定义好结构体stu之后,使⽤这个结构体类型的时候,C语⾔需要写关键字struct,⽽C++⾥⾯可以省略
不写:

struct stu {
   
   
 int grade;
 float score;
};
struct stu arr1[10]; // C语⾔⾥⾯需要写struct
stu arr2[10];// C++⾥⾯不⽤写

这个引⽤符号&要和C语⾔⾥⾯的取地址运算符&区分开来,他们没有什么关系,C++里面的引⽤是指在变量名之前加⼀个&符号,⽐如在函数传⼊的参数中int &a,那么对这个引⽤变量a做的所有操作都是直接对传入的原变量进⾏的操作,并没有像原来int a⼀样只是拷⻉⼀个副本(传值),举两个例子:

void func(int &a) {
   
    // 传⼊的是n的引⽤,相当于直接对n进⾏了操作,只不过在func函数中换了个名字叫a
 a = 99;
}
int main() {
   
   
 int n = 0;
 func(n); // n由0变成了99
}
void func(int a) {
   
   // 传⼊的是0这个值,并不会改变main函数中n的值
 a = 99;
}
int main() {
   
   
 int n = 0;
 func(n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_无感

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值