刷题技巧与常识C++
1.输入输出
(1)按行读取
方法一:读取一行内容。getline(cin,str)
方法二:循环读取一行内容,直到EOF失败。while(getline(cin,str))
(2)矩阵存储
方法一:vector< vector<int> > M(n,vector<int>(m,0))
传参方法:fun(vector< vector<int> > M);
(3)重新读取一整行内容
方法一:cin.get() 然后使用getline(cin,str)继续读取内容
2.字符串操作
(1) String类
初始化:String str;
末尾追加一个字符:str.push_back(char n);
查找一个字符:
int find(char c, int pos = 0) 从pos开始查找字符c, 返回下标。
查找子串:
int find(char *s, int pos = 0) 从pos开始查找字符串在当前串的位置,找不到返回-1.
串比较:
string == "obj"。
返回C指针:
char * temp = obj.c_str();
删除字串、字符、指定长度字符串:
iterator erase (iterator p); string& erase(size_t pos=0, size_t len = npos); iterator erase (iterator first, iterator last);
字符串字典序排序:
在 C 语言中,我们可以使用 strcmp()
函数比较 char*
类型字符串的字典序。
当字符串 s1 的字典序小于字符串 s2 的字典序时,返回值 < 0。
当字符串 s2 的字典序大于字符串 s1 的字典序时,返回值 > 0。
当字符串 s1 的字典序等于字符串 s2 的字典序时,返回值 = 0。
在 C++ 语言中,我们可以使用 compare() 函数比较 string 类型字符串的字典序。
string s1 = "a";
string s2 = "b";
cout << s1.compare(s2) << endl; //-1
cout << s2.compare(s1) << endl; //1
cout << s1.compare(s1) << endl; //0
3.基本数据结构操作
(1)queue队列
初始化:queue q;
入队: q.push(element)
出队:q.pop(element)
返回队头元素:element = q.front()
返回队尾元素:element = q.back()
判断空:empty() 空返回true
返回队列中个数:size()
(2) stack栈
初始化:
入栈:stack.push(element) 入栈一个元素
出栈:stack.pop() 弹出一个元素
返回栈顶元素:element = top()
判断空:empty() 空返回true
返回栈中个数:size()
(3) list
reverse(a.begin(), b.end()); 逆置
a.merge(n,greater<int>()); 合并
a.unique(); //删除所有和前一个元素相等的元素
a.remove(element)
(4) bitset 类;位图类
bitset<n> bitmap(a); 通过数字来初始化比特位,默认各个位是0;
string str(“0001010101010101”)
bitset<n> bitmap(str);将这个字符串初始化为一个比特图;
bitset<n> bitmap(str, 5 ,4) ;从5号位开始,将4位长度内容初始化位一个比特图;
bitmap.count() 为1的个数; bitmap.flip() 取反;>> 输出;bitmap.set() 设置为0; reset() 设置为1.
any() 是否存在为1的位?
(5) 迭代器遍历
数学遍历:for(auto it = vec.begin(); it != s.end(); it++)
逆向遍历:for(auto it = vec.rbegin(); it != s.rend(); it++)
求两个迭代器之间的距离 distance(first, last);
(6) set类 (集合的交,并,差)
a.insert(temp) ; //插入操作
set_intersection(x.begin(),x.end(),y.begin(),y.end(),inserter(a,a.end()));
set_union(x.begin(),x.end(),y.begin(),y.end(),inserter(b,b.end()));
set_difference(x.begin(),x.end(),y.begin(),y.end(),inserter(c,c.end()));
4.格式化输出
(1)C语言格式化输出
printf("%m.nf",double); m为宽度,n为小数位数。
(2)C++ 、C对其输出
左10字符对齐:printf("%-10d",num);
右10字符对齐:printf("%10d",num);
5.常用STL与C-lib算法(<algorithm>)
排序:sort(obj.begin(), obj.end())
大小写转换:toupper(), tolower()
整形到字符串:string to_string(n) ;
字符串到整形:int ci = stoi(char *c); int ci = atoi(const char* c); const char * 来源于c_str()
#反转容器元素:reverse()
#交换两个元素位置: swap()
#删除容器中的重复元素: unique()
返回比大小:max,min,min_element,max_element
c = max(a,b) 返回最大的元素
c = *max_element(M[i].begin(),M[i].end());
6.常用IO设定
关闭IO同步:std::ios::sync_with_stdio(false);
7.模板
(1) 按位取数
(2) 排序模板
(3) 大数模板
8.数学库
<math.h>
log(n); 默认底数是10,真数是n, 可利用换底公式进一步计算,logaB = logcB / logcA
9.结构体排序模板
bool comp(node &a, node &b){
return a.x > b.x;
}
>: 从大到小
<: 从小到大
10.进制转换小技巧
八进制:printf("%o",n);
十六进制:printf("%x".n);
sprintf 版本: char s[100] = {0}; sprintf(s, "%x", 15); string num = s; num.length() = 1;