CPP算法之路,不涉及面向对象
C++向下兼容C,没有特别强调的地方就用C来写好啦~
(我爱C,我爱C++)
正文
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
cout << "hello, chunlei" << n + 1 << endl;
return 0;
}
头文件
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>
文件有的使用<>,有的是用"",有什么区别内?
<>
先去系统目录中找头文件,如果没有就到当前目录下找。像标准的头文件stdio.h,stdlib.h等就是这个方法
""
先在当前目录下找,如果没有就到系统目录下找。主要用于include自定义的头文件
文件后缀有的是.h,有的是.cpp,有什么区别内?
.h
中存放类的声明和函数原型
.cpp
存放函数体
命名空间using namespace std到底是什么意思
这句话声明了一个命名空间std
命名空间在多人合作写项目时很有用。因为你定义了变量 a,别人也定义了变量 a,这样就重复定义了。如果你在自己的命名空间中定义了 a,别人在别人的命名空间中定义了 a,这样就不重复了,比如:
using namespace xx;
using namespace yy;
xx::a 和 yy::a 虽然都叫 a,但是不是同一个变量。
std 是系统标准的命名空间,为了和用户定义的名字不重复,所以它声明在 std 这个命名空间中。这个空间包括了系统所有的支持,比如cin,cout等等。
如果不加using namespace std; ,就需要在每一行代码前加上std::
std::cin >> n;
std::cout << "hello, chunlei" << n + 1 << endl;
丑丑的。所以还是在一开始加上比较好,省时省力又好看(๑•ᴗ•๑)♡
cin和cout
和printf、scanf一样,cin和cout在头文件iostream中。
关于iostream
看名字就知道,i是input,o是output,所以这个头文件里包含的方法就是管理一些输入输出流的
cin>>n,表示输入
cout<<n,表示输出
非常的清晰方便,不需要写取地址符,不需要写类型,nice~(๑•ᴗ•๑)♡
BUT,虽然cin和cout用起来方便,但是效率不如scanf和printf。所以对算法复杂度不高的题目可以用,对于算法复杂度要求高的题目使用scanf和printf可以提高效率
关于endl和"\n"
可以使用"\n"代替endl,微小区别是endl会比"\n"换行后多一个刷新输出缓冲区的操作。无伤大雅
#include <iostream>
using namespace std;
int main()
{cout << "Hello, world!" << "\n";return 0;
}
如果前面是字符串的话会方便一些
cout << "hello, chunlei~\n";
如果前面是变量的话endl会方便一些
cout << n << endl;
哈哈都可以啦O(∩_∩)O
变量的声明
C语言的变量声明一般都在函数开头,但是C++在首次使用变量之前声明即可。当然也可以都放在函数开头
bool变量
有两个值,true和false。
C++把所有非零值解释为true,零值解释为false。所以直接赋值一个数字给bool变量也是可以的。他会自动根据int值是否为零来决定给bool变量赋值为true还是false
bool flag = true;
bool flag2 = -2; // flag2为true
bool flag3 = 0; // flag3为false
使用const定义变量
和C相同
字符串
C++的字符串有两种形式:C风格字符串和string类
C风格字符串:以null结尾的字符数组
string类好用到停不下来:有了string类,定义、拼接、输出、处理都十分方便
string s = "hello world"; // 赋值
string s2 = s;//赋值
string s3 = s + s2; // 字符串拼接直接⽤+号就可以
string s4;
cin >> s4; // 读⼊字符串
cout << s; // 输出字符串
string中还有个很常用的函数叫做substr,作用是截取某个字符串中的子串
string s2 = s.substr(4); // 表示从下标4开始⼀直到结束
string s3 = s.substr(5, 3); // 表示从下标5开始,3个字符
注意!
1.string只能用cin和cout处理,无法使用scanf和printf
2.用cin读入字符串的时候,是以空格为分隔符的,如果想要读入一整行的字符串,就需要用到getline
3.字符串的长度可以用.length
获取,而且有几个字符长度就是多少,不存在字符数组里面的什么末尾结束符之类的(。・ω・。)ノ♡
string s; // 定义⼀个空字符串s
getline(cin, s); // 读取⼀⾏的字符串,包括空格
cout << s.length(); // 输出字符串s的⻓度,包括空格哦
比如输入:chun lei,共有8个字符
指针
(美好的世界怎么可以没有指针₍₍٩( ᐛ )۶₎₎♪)
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
指针的算术运算
-
加法运算:可以对指针进行加法运算。当一个指针p加上一个整数n时,结果是指针p向前移动n个元素的大小。例如,如果p是一个int类型的指针,每个int占4个字节,那么p + 1将指向p所指向的下一个int元素。
-
减法运算:可以对指针进行减法运算。当一个指针p减去一个整数n时,结果是指针p向后移动n个元素的大小。例如,如果p是一个int类型的指针,每个int占4个字节,那么p - 1将指向p所指向的前一个int元素。
-
指针与指针之间的减法运算:可以计算两个指针之间的距离。当从一个指针p减去另一个指针q时,结果是两个指针之间的元素个数。例如,如果p和q是两个int类型的指针,每个int占4个字节,那么p - q将得到两个指针之间的元素个数。
-
指针与整数之间的比较运算:可以将指针与整数进行比较运算。可以使用关系运算符(如<、>、<=、>=)对指针和整数进行比较。这种比较通常用于判断指针是否指向某个有效的内存位置。
结构体
(当时C这一块没学好,好好记笔记ing(◞‸◟ ))
定义结构
#include <iostream>
using namespace std;void printbook(struct Books book);struct Books
{string name;string author;string subject;int id;
}book1,book2;int main()
{//book1book1.name="heihei";book1.author="lichunlei";book1.subject="sha";book1.id=1;//book2book2.name="haha";book2.author="lichunlei";book2.subject="ben";book2.id=2;printbook(book1);printbook(book2);return 0;
}void printbook(struct Books book)
{cout << "title : " << book.name <<endl;cout << "author : " << book.author <<endl;cout << "subject : " << book.subject <<endl;cout << "id : " << book.id <<endl;
}
Books是结构体类型名,book是变量名。变量可以定义多个
访问
使用.
运算符
作为函数参数
把他当做一个普通的变量就好啦
注意!
C++结构体里面可以定义构造函数
使用结构体的时候,C需要些关键字struct,C++不需要
struct stu {
int grade;
float score;
};
struct stu arr1[10]; // C语⾔⾥⾯需要写成struct stu
stu arr2[10];// C++⾥⾯不⽤写struct,直接写stu就好啦
指向结构的指针
#include <iostream>
using namespace std;//声明一个结构体Books
struct Book{string name;string author;string subject;int id;//构造函数Book(string name, string author, string subject, int id):name(name), author(author), subject(subject), id(id){
}
};//打印
void printBookInfo(const Book& book)
{cout << "name: " << book.name << endl;cout << "author: " << book.author << endl;cout << "subject: " << book.subject << endl;cout << "ID: " << book.id << endl;
}int main()
{
Book book1("C++ Primer", "Bjarne Stroustrup", "Programming", 101);
Book book2("C++ Primer Plus", "Bjarne Stroustrup", "Programming", 102);printBookInfo(book1);
printBookInfo(book2);return 0;
}
定义方式与定义指向其他类型变量的指针相似
struct Books *struct_pointer;
->
箭头运算符