输入输出
cin >>
cout <<
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);//取消同步流
string操作
getline(cin, a);//输入字符串(可以输入空格)
s1 = s.substr(n, m);//复制s从第n个字符开始,往后m个字符到s1中
s1 = s.substr(n);//复制s从第n个字符开始到结束的所有字符到s1中
结构体
声明结构体时不需要写struct
struct stu{
string name;
int age;
}
int main()
{
stu a;//不需要写struct,如果是c写法:struct stu a;
}
引用
void func(int &a)
{
a++;
}
int main()
{
a = 4;
func(a);
cout << a;//结果为5,引用会改变参数本身
}
运算符重载
//格式
返回类型 operator 运算符(参数列表)
{
函数体;
}
//例子
bool operator < (const Book &u) cosnt
{
if(a == u.a && b == u.b)
return c < u.c;
if(a == u.a)
return b < u.b;
return a < u.a;
}
STL
vector
#include<vector>
vector <int> v;//声明向量(数组)
cout << v.size();//输出向量大小,当前结果为0
v.resize(10);//给向量v分配10个空间
cout << v.size();//当前结果为10
v.push_back(5);//给v的尾端追加数据5
vector <int> a(10);//声明向量a并分配10个空间,默认数值为0
vector <int> b(10,2);//声明向量b并分配10个空间,数值都为2
//对vector a进行排序和去重
sort(a.begin(), a.end());
a.erase(unique(a.begin(), a.end()), a.end());
//因为unique是比较相邻元素是否重复的,因此要先排序后去重。unique返回的地址是去重后最后一个不重复的元素的下一个地址,unique本身只是将重复的元素移到靠后的位置,erase才是执行删除c
迭代器
for(auto p = v.begin(); p != v.end(); p++)
cout << *p << " ";
//一种遍历数组v的方法,注意:bigin()、end()返回的是地址
cout << p.front() << " ";
//front()返回第一个元素
for(auto i : s)
cout << i << ' ';
//遍历数组s,这种写法是把每个s的元素拷贝一份赋给变量i,再将变量i输出,这样是不能修改s的元素的值的,更好的写法是引用
for(auto &i : s)
cout << i << ' ';
//引用的写法可以修改s的元素,并且少了拷贝的步骤,效率更高,每个i就是s的元素本身。
set
//set是集合,元素不重复,自动排序
#include<set>
set <int> s;//s后面不能写其他内容
s.insert(10);//向集合s中插入元素10
s.find(10);//查找元素10,返回指针
s.erase(10);//删除元素10
#include<unordered_set>//额外添加头文件
unordered_set <int> a;//不排序的集合
map
//map是键值对,它会自动将所有的键值对按照键的大小,从小到大排序
#include<map>
map <string, int> m;
m["hello"] = 2;
m["world"] = 3;
cout << "hello = " << m["hello"] << '\n';
for(auto p = m.begin(); p != m.end(); p++)
cout << p->first << " : " << p-> second << '\n';
cout << m.size() << '\n';//输出m的长度
#include<unordered_map>//额外添加头文件
unordered_map <string, int> s;//不排序的键值对
栈
//先进后出
#include<stack>
stack <int> a;
a.push(1);
a.push(2);//进栈
a.pop();//出栈
cout << a.top() << '\n';//栈只能访问栈顶
cout << a.size() << '\n';//输出栈的长度
队列
//先进先出
#include<queue>
queue <int> a;
for(int i = 1; i <= 10; i++)
s.push(i);
cout << s.front() << " ";//获取队首(第一个元素)
cout << s.back() << " ";//获取队尾(第二个元素)
s.pop();//将队首出队
cout << s.size() << " ";//获取队列长度
bitset
//bitset类似于一个字符数组(二进制位),但是与常识不一样,它会把最右边的位作为第0位,从右往左依次增加。
bitset<5> b;//声明一个长度为5的二进制数组,默认全为0
bitset<5> b(1);//括号内为int型时,声明一个长度为5的二进制数组,值为1的二进制,即00001。注意:括号中数字大于给定字长所能表示的最大数字则会溢出
bitset<5> b("123");//括号内为字符串时,输出为在字符串前加0,直到长度等于5
b.arry();//b中是否有1
b.none();//b中是否没有1
b.count();//b中1的个数
b.size();//b的大小
b.test(i);//下标为i的元素是不是1,注意,这里的下标是从右向左的。
b.flip();//所有位取反
b.flip(i);//第i位取反,下标从右向左
b.reset();//所有位归零
b.reset(i);//第i位归零
unsigned long a = b.to_ulong();//将bitset转unsigned long类型
s = "0110101";
bitset <5> b(s. 0, 5);//从s的第0位开始,总共向b中放入5位数据,若放入长度小于b的长度,则在左边补零,这句与bitset<5> b(s);等效
sort
#include<algorithm>
//sort对数组a[]或向量vector进行排序,默认从小到大排序
//数组sort(a, a + n);
//向量sort(v.begin(), v.end());
bool cmp(int x, int y)//x在y前面
{
return x > y;//如果返回值为0,则交换两数
//大于号-从大到小排、小于号-从小到大排
}
sort(v.begin(), v.end(), cmp);//手写cmp函数,进行从大到小排序
struct stu
{
string name;
int age;
};
bool cmp(stu a, stu b)
{
if(a.age != b.age)
return a.age > b.age;//按年龄从大到小排序
else
return a.name < b.name;//按名字从小到大排序
}
cctype
#include<cctype>
//对字符操作的函数
char c = 'A';
isalpha(c);//判断是不是字母
islower(c);//判断是不是小写字母
issupper(c);//判断是不是大写字母
isalnum(c);//判断是不是字母或数字
isspace(c);//判断是不是空格/ '\t' / '\r' / '\n'
tolower(c);//转化为小写字母
toupper(c);//转化为大写字母
for遍历
for(int i : arr)
cout << i << '\n';//输出每个元素的值,这里不能改变元素的值
for(int &i : arr)
i = i * 2;//将数组中每一个元素都乘2,只有在引用的时候才能改变元素的值,这种修改只存在于for内部,在循环之外,arr还是原先的值,没有改变。
for(auto i : arr)
i = i * 2;//使用auto遍历
to_string
//将数字转化为字符
#include<string>
string s = to_string(123.1);
cout << s << '\n';
printf("%s\n",s.c_str());
stoi stod
int a = stoi("123");//将字符串转化为int
double b = stod("123");//将字符串转化为double
reverse
//reverse函数用于反转在[first,last)范围内的顺序(包括first指向的元素,不包括last指向的元素),reverse函数没有返回值
//反转数组顺序
int p[5]={1,2,3,4,5};
reverse(p,p+5);//5,4,3,2,1
//反转vector容器中元素顺序
vector<int> v = {5,4,3,2,1};
reverse(v.begin(),v.end());//v的值为1,2,3,4,5
//反转string类的字符串
string str="www.mathor.top";
reverse(str.begin(),str.end());//str结果为pot.rohtam.wwww