字符串
cin >> str; // 输入字符串时,遇到空格或者回车就会停止
cout << str << endl; // 输出字符串时,遇到空格或者回车不会停止,遇到'\0'时停止
# fgets()会把回车也读入 fgets(a, 101,stdin) 字符串中有空格时候用
; scanf 也会读入回车(替换比较时需要注意) cin不会
// gets函数在新版C++中被移除了,因为不安全。
// 可以用fgets代替,但注意fgets不会删除行末的回车字符
字符数组的常用操作
#include <string.h>
(1) strlen(str),求字符串的长度
(2) strcmp(a, b),比较两个字符串的大小,a < b返回-1,a == b返回0,a > b返回1。这里的比较方式是字典序!
(3) strcpy(a, b),将字符串b复制给从a开始的字符数组。
标准库类型string
可变长的字符序列,比字符数组更加好用。需要引入头文件:#include <string>
注意:不能用printf直接输出string,需要写成:printf(“%s”, s.c_str()); cout可以直接输出string
使用getline读取一整行 getline(cin, s); 字符串中有空格时候用 末尾不会多输入回车
使用puts()用头文件#include<stdio.h> 直接输出一个“....”具体的字符串 puts()也可直接输出一个字符串 如 puts(str); puts()会自动输出字符串末尾的回车,cin和sanf不会
a.substr(0,p+1) //substr 函数 (起始位置,长度)字符串截取
for (auto &c : s) 遍历字符串每个元素c,进行修改所以要加&取地址
str.back() 指的是字符串最后一个 str.popback() 指的是去掉字符串最后一个
#include<algorithm> swap( , ) sort( , ) 默认: 两个参数first
,last
,将[first, last)
区间内元素升序排列。【注意区间为左闭右开】 sort(a,a+n) a为数组 n为数组内元素个数
tolower(str[i]) 将该元素小写 toupper(str[i]) 将该元素大写
#include<ctype.h>
双指针算法
类
分为public和private: 公有代表在类外面可用 私有代表在类内部可用
类中的变量和函数统称为成员变量
结构体和类的作用是一样的。不同点在于类默认是private,结构体默认是public。
构造函数对应赋值,也可以如下更快赋值
指针
开在栈里的一般是局部变量,是随机的数 开在堆里的一般是全局变量,均为0
new 开辟一片动态空间,返回的是地址
如果定义的是成员变量,则用a.next()来调用
如果定义的是指针,则用->来调用
删除:要想删除一个节点,必须找到前一个节点的地址,然后令其指向下一个地址,完成删除操作。
反转链表
有序合并两个链表
两链表第一个公共节点
空节点的三种写法: 0 ,NULL ,nullptr
删除链表重复点
设置虚拟头节点,保证最后输出指向next为头节点
stl
vector
1. #include <vector>
vector是变长数组,支持随机访问,不支持在任意位置 O(1)插入。为了保证效率,元素的增删一般应该在末尾进行。
声明
#include <vector> // 头文件
vector<int> a; // 相当于一个长度动态变化的int数组
vector<int> b[233]; // 相当于第一维长233,第二位长度动态变化的int数组
struct rec{…};
vector<rec> c; // 自定义的结构体类型也可以保存在vector中
size/empty
size函数返回vector的实际长度(包含的元素个数),empty函数返回一个bool类型,表明vector是否为空。二者的时间复杂度都是 O(1)。所有的STL容器都支持这两个方法,含义也相同
clear
clear函数把vector清空。
迭代器(一般不用,了解)
迭代器就像STL容器的“指针”,可以用星号*操作符解除引用。
一个保存int的vector的迭代器声明方法为:
vector<int>::iterator it;
vector的迭代器是“随机访问迭代器”,可以把vector的迭代器与一个整数相加减,其行为和指针的移动类似。可以把vector的两个迭代器相减,其结果也和指针相减类似,得到两个迭代器对应下标之间的距离。
begin/end(string也同理,string也属于是容器)
begin函数返回指向vector中第一个元素的迭代器。例如a是一个非空的vector,则*a.begin()与a[0]的作用相同。
所有的容器都可以视作一个“前闭后开”的结构,end函数返回vector的尾部,即第n 个元素再往后的“边界”。*a.end()与a[n]都是越界访问,其中n = a.size()。
vector的遍历
for (vector<int>::iterator it = a.begin(); it != a.end(); it ++) //与第二种方法一致,但更加简便
cout << *it << endl;
front/back
front函数返回vector的第一个元素,等价于*a.begin()和a[0]。
back函数返回vector的最后一个元素,等价于*--a.end()和a[a.size() – 1]
push_back()和pop_back()
a.push_back(x)把元素x插入到vector a的尾部。
b.pop_back()删除vector a的最后一个元素。
拓展: vector的拷贝 是每次*2的倍增拷贝
位运算
左移与右移
常用操作
求x的第k位数字 x >> k & 1 如上图
lowbit(x) = x & -x,返回x的最后一位1 如下图