cpp刷题常用

笔试输入输出

以下摘自: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;
            });
    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值