文章目录
笔试输入输出
以下摘自:C++ 笔试——常见输入和输出
-
基础:cin / cin.getline / cin.get / getline(string)简单用法
1.Tab、space结束符。enter是判断输入流结束的表现。不要把他和普通的结束符看成一样的。
2.cin.getline / cin.get都是遇到enter会终止,但不同的是,cin.getline会把缓冲区当中的enter删除掉,不影响下一次的输入。而cin.get不会删除。
3.getline(string):Get line from stream into string (function ),不是遇到space tab就结束的,会记录下字符串当中的space。 -
注意:>> 是会过滤掉不可见字符(如 空格 回车,TAB 等
-
多组测试数据(while(cin>>…))
比如 输入的N组数据 5 1 2 3 4 5 3 int n; while(cin>>n){ //while cin这里 int* a = new int[n]; ... }
-
无空格的字符串可以用cin
-
cin.getline()
cin.getline 允许读取包含空格的字符串。它将继续读取,直到它读取至最大指定的字符数,或直到按下了回车键,比如:cin.getline(sentence, 20);
读取的字符数将比该数字少一个,为 null 终止符留出空间
pair
创建pair
arr.push_back({20,40}); // 直接用花括号
arr.push_back(make_pair<int,int>(20,40)); // 这样也行
vector
定义二维vector
vector<vector <int> > ivec(m ,vector<int>(n)); //m*n的二维vector,注意两个 "> "之间要有空格!
以数组初始化一个vector
c11及以上可用:
vector<int> list = {1,2,3.0,4,5,6,7};
vector<int> list {1,2,3.0,4,5,6,7};
删除末尾元素
vec.pop_back();
自定义排序规则(重要)
可以使用运算符重载,也可以自己写仿函数,推荐自己写仿函数
bool cmp(const int& a, const int& b){
return a > b; //从大到小排序
}
int main(){
int a[10] = {2, 3, 30, 305, 32, 334, 40, 47, 5, 1};
vector<int> nums(a, a + 10);
sort(nums.begin(), nums.end(), cmp);
for(auto x : nums)
cout << x<<" ";
return 0;
}
queue/priority_queue
出队/返回队头元素
pop()
:只出队,不会返回队头元素
top()
:返回队头元素
创建大根堆/小根堆
定义:priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
。
//升序队列 => 小根堆
priority_queue <int,vector<int>,greater<int> > q;
//降序队列 => 大根堆
priority_queue <int,vector<int>,less<int> >q;
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
greater<int 表示前面的数比后面的数大,但这是对排好序的数组而言。联想堆的实现,要使得排好序后是降序,那么就应该使用小根堆!……千万注意堆和数组是反着的……
deque
增加元素push_front()、push_back()
//a) 构造函数
deque<int> ideq
//b)增加函数
ideq.push_front( x):双端队列头部增加一个元素X
ideq.push_back(x):双端队列尾部增加一个元素x
//c)删除函数
ideq.pop_front():删除双端队列中最前一个元素
ideq.pop_back():删除双端队列中最后一个元素
ideq.clear():清空双端队列中元素
//d)判断函数
ideq.empty() :向量是否为空,若true,则向量中无元素
//e)大小函数
ideq.size():返回向量中元素的个数
删除元素pop_front()、pop_back()
获取队头、队尾元素
que.front();
que.back();
stack
出栈/返回栈顶元素
pop()
:只出栈,不会返回栈顶元素
top()
:返回栈顶元素
判断栈是否空
empty()
返回栈中元素个数
size()
string
往末尾插入字符
str.push_back(ch)
排序字符串内的字母
sort(str.begin(),str.end());
截取子串
s.substr(pos, n);
截取s中从pos开始(包括pos处)的n个字符的子串,并返回
pair
pair就是一个结构体,通过first、second成员取其中的元素
map/unordered_map
map
红黑树实现,会对数据排序,默认是根据key从小到大排序
unordered_map
hash表实现,其中的元素无序
根据map/unordered_map的val排序
需要先转换为pair,然后使用sort排序:
vector<pair<char, int>> vec;
for (auto &it : mp) {
vec.emplace_back(it);
}
sort(vec.begin(), vec.end(), [](const pair<char, int> &a, const pair<char, int> &b) {
return a.second > b.second;
});
map中判断是否存在
map.find(key) == map.end()
删除元素
mymap.erase(val);
或者 mymya.erase(iter);
multiset(todo)
数字转换字符串
int num=123;
string numstr;
stringstream ss;
ss << num;
ss >> numstr;
lambd表达式
- 用法
[](){}
举例如下:sort(vec.begin(), vec.end(), [](const pair<char, int> &a, const pair<char, int> &b) { return a.second > b.second; });