highlight: a11y-dark
基础
c++中含有多个函数,可以直接调用
通过一个例子初步了解c++
#include<iostream>
//i 代表input o 代表output 输入输出流
using namespace std;
//封装函数 std中封装了cin cout
int main()
{
int n;
cin >> n;
//cin就是sacnf 的意思
cout << "wohaoshuai" << n++ << endl;
//cout输出多个<<号可以用来输出
//endl 意思是 end of line 换行
return 0
}
头文件
去掉.h直接在开头加c
对于所有的头文件都可
变量声明
for循环可以直接定义
#include<iostream>
using namespace std;
int main(void)
{
int n;
cin >> n;
for (int i = 0; i < 10; i++)
cout << n << " ";
cout << endl;
for (int i = 0; i < 10; i++)
cout << n + 1 << " ";
return 0;
}
bool 变量
非0为true, 0为false
const定义常量
#include<iostream>
using namespace std;
int main(void)
{
const int MAX = 150;
//等同于在c语言中的#define MAX 150
//该常量不可改变
cout << MAX << endl;
return 0;
}
string类
定义
string s= "hello"
拼接
s=s1 + S2
输入输出
cin>>s
cout<<s<<endl
getline(cin,s)
getline(cin,s)
解决cin只能输入一个单词的问题,中间有空格的话只能打印前半个
处理
s.length()
s1=s.substr(n,m)
或是s1=s.substr(n)
若有两个参数,n 代表从第几个字符开始,m代表输入n后面的m个字符
若有一个参数,则n后面的字符全部输出
结构体
可以省去struct
c++中可以省去这个struct
引用&和传值
int $a
和int a
STL
vector
动态数组
头文件
#include<vector>
创建数组
vextor<int>v(10,2)
vector<int>v(10)
vector<int>v
- 元素值默认为0
分配数组大小
v.resize(length)
末尾添加新的数据
v.push_back(data)
迭代器
遍历数组,不用考虑开头与结束
for(auto p=c.begin();p!=c.end();p++ {cout<<*p<<"";}
注意
end是在数组结束的下一个位置
若我们在后面添加元素,迭代器会自动帮我们迭代
注意切换到c++11
set
set是集合,它里面的元素各不相同,而且元素会按照从小到大排序
头文件
#include<set>
创建集合
set<int> s;
s后面不可以加内容
处理
- 插入
s.insert(data);
- 查找
s.find(data);
s.find()
返回值是一个指针
- 删除
s.erase(data);
#include<iostream>
#include<set>
using namespace std;
int main(void)
{
set<int>s;
//s后面不能带任何参数
s.insert(2);
s.insert(1);
s.insert(3);
//sert是会自己排序
for (auto p = s.begin(); p != s.end(); p++)
{
cout << *p << "";
}
cout << endl;
cout << (s.find(2) != s.end()) << endl;
//是遍历寻找,从第一个开始到最后一个看是否有2这个元素
//但注意返回的是个指针
cout << (s.find(4) != s.end()) << endl;
s.erase(1);
//删除元素
cout << (s.find(1) != s.end()) << endl;
//再来寻找1存在吗
return 0;
}
}
map(键值对)
map是键值对,他会自动将所有的键值对按照键从小到大排序
头文件#include<map>
创建键值对map<string,int>m;
处理
-
添加
m["hello"]=2
-
访问
如果存在"world",就返回值,否则返回0.
cout<<m["world"];
-
遍历
迭代器
获取值时类似结构体指针
- 获取长度
m.size()
#include<iostream>
#include<map>
using namespace std;
int main(void){
map<string, int>m;
m["hello"] = 2;
//结构体的集合
m["world"] = 3;
m["ildfh"] = 4;
//比较的字符例h<i<w
cout << "hello:" << m["hello"] << endl;
for (auto p = m.begin(); p != m.end(); p++)
//结构体的调用
cout << p->first << ":" << p->second << endl;
cout<<"map的长度" << m.size() << endl;
return 0;
}
stack(栈)
头文件#include<stack>
创建栈stack<int>s;
处理
栈在处理时只能处理栈顶
- 压栈
s.push(i);
- 出栈
m.pop();
- 访问栈顶
s.top();
- 获取长度
m.size();
对于栈不能用begin的
#include<iostream>
#include<stack>
using namespace std;
int main(void){
stack<int>s;
s.push(1);
s.push(2);
s.push(3);
s.pop();
//压栈
//访问栈顶
cout << s.top() << endl;
//输出的为2,因为先把1放在栈下面
cout << "栈的长度为:" << s.size() << endl;
return 0;
}
queue
先进先出,后进后出
头文件
创建队列
处理
- 入队
s.push(i)
- 出队
s.pop()
- 访问
访问队首
s.front();
访问队尾
s.back();
- 获取长度
s.size()
#include<iostream>
#include<queue>
using namespace std;
int main(void){
queue<int> s;
for (int i = 1; i < +10; i++)
s.push(i);
cout << "队首为:" << s.front() << endl << "队尾为:" << s.back() << endl;
s.pop();
cout << "队首为:" << s.front() << endl << "队尾为:" << s.back()<< endl;
s.push(11);
cout << "队首为:" << s.front() << endl << "队尾为:" << s.back() << endl;
cout << s.size() << endl;
return 0;
}
unordered_map
和unordered_set
这两个其实就是不会排序的map(键值对)和set(集合),它们省去了排序的过程,如果刷题的额时候超时了,可以使用这两个
位运算bitset
bitset类似一个字符数组,但是它是从二进制的低位到高位依次为b[0]、b[1],所以按照b[i]的方式输出和直接输出b的结果相反
000010111000101从低位往高位存储,从末尾1开始存储
初始化
bitset<5>b;
5表示5个二进制位,初始化为0
bitset<5>b(u);
u为unsigned int,如果u=1,则输出b的结果为00001
bitset<8>b(s);
s为字符串,如“1101”,则输出b的结果为00001101,在前面补0
bitset<5>b(s,pos,n)
从字符s[pos]开始,n长度
处理
b是否有1的二进制位b.any();
b不存在1吗b.none();
b中1的个数b.count();
b中元素的个数b.size();
下标为i处是不是1b.tset(i);
把下标i处设置为1b.set(i);
归零
所有位归零b.reset();
第i位归零b.reset(i);
取反
所有位取反b.flip();
第i位取反b.filp(i)
转换位unsigned long 类型 unsigned long a =b.to_ulong();
#include<iostream>
#include<bitset>
using namespace std;
int main(void){
bitset<5>b(19);
//最多输入5位,初始化时二进制时19即10011
cout << b << endl;
//按字符数组输出
for (int i = 0; i < b.size(); i++)
cout << b[i] << " ";
//输出相反
cout << endl;
cout << "是否有:" << b.any() << endl;
cout << "是否不存在:" << b.none() << endl;
cout << " 1的个数:" << b.count() << endl;
cout << "b中元素的个数" << b.size() << endl;
//大小
cout << "下标为i的元素是不是1" << b.test(0) << endl;
//从后面往前数
b.flip(1);
//flip取反 0改成1, 1改成0
cout << b << endl;
unsigned long a = b.to_ulong();
//把二进制数转换位整数
cout << a << endl;
return 0;
}
sort函数
主要功能是对一个数组(int arr[]或者 vector)进行排序。vector是容器,需要用v.begin()表示头,v.end()表示尾;而int arr[]使用arr表示数组的首地址,arr+n表示尾部
头文件
#include<algorithm>
#include<iostream>
#include<algorithm>
//算法的意思
#include<vector>
using namespace std;
int main(void) {
vector<int>m(11);
//定义数组
for (int i = 10; i > 0; i--)
m[i] = 11 - i;
//赋值
m.push_back(-1);
for (int i = 0; i<10; i++)
cout << m[i] << " ";
cout << endl;
sort(m.begin(), m.end());
//告诉m排序的初始位置与最后元素的下一个地址是一个[)的
for (int i = 0; i < 11; i++)
cout << m[i] << " ";
return 0;
}
使用sort自定义cmp函数
sort默认是从小到大
cmp允许我们定义一些比较复杂的规则
原理
bool cmp(int x, int y)
如果返回值为真,那么x放在y前面
(返回值为假时,交换两个数)
否则x放在y后面
注意:cmp返回值必须使用>或者<,不能有>=或者<=
#include<iostream>
#include<algorithm>
//算法的意思
#include<vector>
using namespace std;
bool cmp(int x, int y)
{
return x > y;
}
int main(void) {
vector<int>v;
//定义数组
for (int i = 1; i <= 10; i++)
v.push_back(i);
//数组内容
sort(v.begin(), v.end(),cmp);
//排序
for (auto p = v.begin(); p != v.end(); p++)
cout << *p << " ";
//用迭代器输出
cout << endl;
return 0;
}
#include<iostream>
#include<algorithm>
//算法的意思
#include<vector>
using namespace std;
struct stu
{
string name;
int age;
};
bool cmp(stu a, stu b)
{
if (a.age != b.age)
//年龄不同的时候小到大
return a.age < b.age;
else
//年龄相同的,ascll小的排前
return a.name < b.name;
}
int main(){
stu s[3];
for (int i = 0; i < 3; i++)
cin >> s[i].name >> s[i].age;
//赋值
sort(s, s + 3, cmp);
//排序s代表一个元素地址,s+3代表第s+3的下一个元素地址
for (int i = 0; i < 3; i++)
cout << s[i].name << " " << s[i].age << endl;
return 0;
}
cctype头文件函数
isalpha();判断是不是字母
islower();判断是不是小写字母
isupper();判断是不是大写字母
isalnum():判断是字母还是数字
isspace();space\t\r\n这些
tolower();转化为小写字母
toupper();转化为大写字母
#include<iostream>
#include<algorithm>
#include<cctype>
//可以对字符操作
using namespace std;
int main(){
char c = 'A';
cout << "isalpha:" << isalpha(c) << endl;
cout << "islower: " << islower(c) << endl;
cout << "isupper:" << isupper(c) << endl;
cout << "isalnum:" << isalnum(c) << endl;
cout << "isspace:" << isspace(c) << endl;
char s = tolower(c);
cout << s << endl;
char s1 = toupper(c);
cout << s1 << endl;
return 0;
}
auto声明
作用:可以让编译器根据初始值直接推断变量的类型
auto x=100;
auto y=1.5;
推广:迭代器
替换set<int>::iterator
#include<iostream>
#include<vector>
//可以对字符操作
using namespace std;
int main(void){
auto x = 19;
auto y = 1.5;
cout << x << "" << y << endl;
vector<int>a(10, 1);
for (auto p = a.begin(); p != a.end(); p++)
cout << *p << "";
return 0;
}
基于范围的for循环
传值
for(int i;arr
cout<<i<<endl;
输出数组中的每一个元素的值,这里不能改变元素的数值
传址
for(int&i;arr) i=i*2;
将数组中的每一个元素都乘以2,只有在引用的时候才能改变元素的值
推广
for(auto i:v)
cout<<i<<"";
这里v是一个vector,其实是所有的容器都可以使用这种方式来循环
#include<iostream>
#include<vector>
//可以对字符操作
using namespace std;
int main(void){
vector<int>b(10, 1);
for (auto i : b)
{
cout << i << " ";
}
cout << endl;
return 0;
}
to_string
作用:将数字转化为字符变量
头文件:#include<string>;
使用方法
string s=to_string(123.1);
prinft("%s\n",s.c_str());
如果这里用printf输出的话需要多加一个.c_str()
stoi stod
作用:将字符串转换为其他变量
处理
stoi
转化为int型
int a=stoi("123");
stod
转化为double型
double = stod("123.56")
补充 stof stold stol stoll stoul stoull
#include<iostream>
#include<string>
//可以对字符操作
using namespace std;
int main(void){
int a = stoi("123");
cout << a - 1;
double b = stod("12.345");
cout << b - 1;
return 0;
}