文章目录
- 常用API的介绍
- **容器**
- 1. vector 容器
- 2. string
- 3. stack (有限制的容器是没有遍历方式的。 只能push或者pop,top . )
- 4. priority_queue优先队列(和栈基本操作相同 , 这种限制的数据结构,都不能乱用erase。不像红黑树这些)
- 5. queue(deque 是双端队列, 我们这里只用到了队列,双端队列的api还不一样, 有四种)
- 6. multiset的使用,不能通过key去找value,本身就是key又是value.按照自身大小排序
- 7. multimap 通过key去排序,不能插入单个元素, 只能成对的pair插入。
- 8 unordered_map
- 9 **算法**
- 10 **迭代器**
- 输入练习
- 总结
- reference
常用API的介绍
容器
1. vector 容器
-
- vector ans 空初始化
-
- vector ans = a ; 拷贝
-
- vector ans{1,2,3.0,4,5,6,7}; 赋值初始化。
-
- vector ans(7,3); 赋值7个3
-
- vector myvector(leastNums.begin(), leastNums.end()); ,这里leastNums是set,但是可以通过迭代器初始化, 只要里面的类型是一样的,都是int类型就可以。
-
- vector<vector> (n,vector<m,1)) 二维数组的初始化
- pop_back 是返回之前探进去的元素。
2. string
-
- std::to_string(1 + 2 + 4 + 7 + 14) + " thsh is a perfect number"; 常量转换成string
-
- 字符串有append 和+ . +适合char, append用于string
- string 也可以使用pop——back和push——back,这之前不太清楚。不知道-怎么操作, 这次知道了。
3. stack (有限制的容器是没有遍历方式的。 只能push或者pop,top . )
- s.top() //返回栈顶元素int
- s.push() // 在栈顶压入一个元素
- s.pop() // 弹出栈顶元素, 不返回栈顶元素。
- s.size() //返回栈中元素的个数
- s.empty() //判断栈是否为空栈
4. priority_queue优先队列(和栈基本操作相同 , 这种限制的数据结构,都不能乱用erase。不像红黑树这些)
:
top 访问队头元素
empty 队列是否为空
size 返回队列内元素个数
push 插入元素到队尾 (并排序)
emplace 原地构造一个元素并插入队列
pop 弹出队头部元素
5. queue(deque 是双端队列, 我们这里只用到了队列,双端队列的api还不一样, 有四种)
入队,如例:q.push(x); 将x接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
6. multiset的使用,不能通过key去找value,本身就是key又是value.按照自身大小排序
-
- multiset<int, greater > leastNums; 从大到小的排序
-
- leastNums.erase(*heapIt); leastNums.insert(*it); 插入删除操作。 注意这个是没有用auto.
7. multimap 通过key去排序,不能插入单个元素, 只能成对的pair插入。
-
- 直接插入, map<string, string> direct; direct.insert( pair<string, string>(“insert”, “插入” ));
-
- 下标插入 if(need.count(temp)){ window[temp]++;}
-
- 如何将map的值插入push到vector呢? 输入迭代器it->second, 而不是*it.迭代器是指针,得用->
-
- 判断是否存在need.count(temp)
-
- for(unordered_map<int, int>::iterator a =window.begin();a!=window.end();a++){} 这个是用指针操作, for each 是用数操作。
- 插入键值对 ans.insert(pair<int , int>{sum ,i});
- 如何查找键值并访问呢? auto ch = ans.find(sum-k); (*ch).second);
8 unordered_map
unordered_map<int,int>
这个直接插入, 可以迭代器遍历,支持下标访问。
删除:
unordered_map 的成员函数 erase() 来移除元素。参数可以是标识元素的一个键或是指向它的一个迭代器。当参数是键时,erase() 会返回一个整数,它是移除元素的个数,所以 0 表示没有找到匹配的元素。当参数是迭代器时,返回的迭代器指向被移除元素后的元素。
auto n = people.erase (“Jim”);// Returns 0 if key not found
auto iter = people.find (“May”) ; // Returns end iterator if key not found
if(iter != people.end())
iter = people.erase (iter) ;// Returns iterator for element after “May”
9 算法
- 反转 std::reverse(myvector.begin(),myvector.end());
- 排序 sort。 sort(a.begin(), a.end(),greater()); 从大到小。
- for auto ch : some 实际上ch是*(it). 不能看成普通的int, char. 这是个模板。 注意这里ch是迭代器,,不能用于交换(因为这样会导致迭代器失效), 我用了swap就报错了。但是sort传入的begin和end是可以的。
10 迭代器
-
迭代器的初始化: auto ch = ans.begin(), 或者vector::iterator it = ans .begin().
-
迭代器由于是只读模式,因此中途不能对迭代器进行赋值。
-
迭代器如何调用对象中的多个成员? * (it). first 或者*(it). second 。
-
注意迭代器如果没有使用*是不能和一般的int进行比较的。
-
上面所说的迭代器是for(i++)情况下的, 在for each情况下只要不换内容,就可以看成基本类型。
-
般迭代器都是指针, 除非我们加* 才能用. 去访问。
-
迭代器使用技巧之如何获取最大元素并且分开:auto it = std::max_element(nums.begin(),nums.end());
vector left (nums.begin(),it);
vector right (++it,nums.end());
输入练习
背景
现在还不会输入输出, 借此机会在牛客网上练习一下。here
内容
1.接收多个a+b, 这里没数据就自己退出while循环了。
#include<iostream>
using namespace std;
int main(){
int a = 0 , b = 0;
while(cin>>a>>b){
cout<<a+b<<endl;
}
return 0;
}
2 ` n个a+b
输入描述:
输入第一行包括一个数据组数t(1 <= t <= 100)
接下来每行包括两个正整数a,b(1 <= a, b <= 10^9)
输出描述:
输出a+b的结果
#include<iostream>
using namespace std;
int main(){
int n;
int a,b;
cin>>n;
for(int i = 0 ;i < n; i++){
cin>>a>>b;
cout<<a+b<<endl;
}
}
3`
链接:https://ac.nowcoder.com/acm/contest/5657/C
来源:牛客网
输入描述:
输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据有多组, 如果输入为0 0则结束输入
输出描述:
输出a+b的结果
#include<iostream>
using namespace std;
int main(){
int a, b ;
while(cin>>a>>b){
if(a==0&&b==0)break;
else cout<<a+b<<endl;
}
}
4`
链接:https://ac.nowcoder.com/acm/contest/5657/D
来源:牛客网
输入描述:
输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
接下来n个正整数,即需要求和的每个正整数。
输出描述:
每组数据输出求和的结果
示例1
输入
复制
4 1 2 3 4
5 1 2 3 4 5
0
输出
复制
10
15
#include<iostream>
using namespace std;
int main(){
int a, sum,n ;
while(cin>>n){
if(n==0)break;
else {
for(int i = 0 ; i < n ; i++ ){
cin>>a;
sum +=a;
}
cout<<sum<<endl;
sum = 0 ;
}
}
}
5`
链接:https://ac.nowcoder.com/acm/contest/5657/E
来源:牛客网
输入描述:
输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。
接下来t行, 每行一组数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。
输出描述:
每组数据输出求和的结果
示例1
输入
复制
2
4 1 2 3 4
5 1 2 3 4 5
输出
复制
10
15
C++(clang++11)
ACM模式
1
#include<iostream>
2
using namespace std;
3
4
int main(){
5
int a , b , n;
6
cin>>n;
7
for(int i = 0; i < n; i++){
8
cin>>a;
9
int sum = 0;
10
for(int j = 0; j < a;j++){
11
cin>>b;
12
sum +=b;
13
}
14
cout<<sum<<endl;
15
}
16
return 0;
17
}
6`
链接:https://ac.nowcoder.com/acm/contest/5657/F
来源:牛客网
输入描述:
输入数据有多组, 每行表示一组输入数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。
输出描述:
每组数据输出求和的结果
示例1
输入
复制
4 1 2 3 4
5 1 2 3 4 5
输出
复制
10
15
#include<iostream>
using namespace std;
int main(){
int n,a,sum;
while(cin>>n){
int sum;
for(int i = 0 ; i < n;i++){
cin>>a;
sum += a;
}
cout<<sum<<endl;
sum = 0;
}
}
7 链接:https://ac.nowcoder.com/acm/contest/5657/G
来源:牛客网
输入描述:
输入数据有多组, 每行表示一组输入数据。
每行不定有n个整数,空格隔开。(1 <= n <= 100)。
输出描述:
每组数据输出求和的结果
示例1
输入
复制
1 2 3
4 5
0 0 0 0 0
输出
复制
6
9
0
#include<iostream>
using namespace std;
int main(){
int n,a,sum;
while(cin>>n){
sum = sum +n;
if(cin.get()=='\n'){ // 读一个字符,包括空格
cout<<sum<<endl;
sum = 0;
}
}
}
链接:https://ac.nowcoder.com/acm/contest/5657/K
来源:牛客网
输入描述:
输入有多组测试用例,每组空格隔开两个整数
输出描述:
对于每组数据输出一行两个整数的和
示例1
输入
复制
1 1
输出
复制
2
#include<iostream>
using namespace std;
int main(){
long a,b;
while(cin>>a>>b){
cout<<a+b<<endl;
exit(0);
}
}
// 字符串处理 , 会这一个就很了灵活了, 啥都能干。
# include <bits\stdc++.h>
using namespace std;
int main(){
int n ;
cin>>n;
string str;
fflush(stdin);//用这个可以全部清空
while(gets(cin,str,' ')){// 这是以空格为结束, 可以设置以默认换行结束。 cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数。
if(str == " ")break;
cout<<str<<endl;
// if(cin.get()=='\n')break; // 读取一个字符、
}
cout<<"hello"<<endl;
}
总结
- 自己对 输入的理解更深入了一些, 如果我们是vector这种,多种测试样例的话就设置成while,然后放入数据到vector之中,如果检测到\n就进行计算,然后把vector清空继续做。笔试前一定要看这些输入的代码。尤其是那些可以输入不知道多少行的
- 普通的cin对空格或者回车 tab都认为进入下一个。 如果没有的话,直接退出了。
- cin.getline与cin.get的区别是,cin.getline不会将结束符或者换行符残留在输入缓冲区中。会读到接收的数组或者字符串中。
reference
- 输入参照文章1
- fflush(stdin);//用这个可以全部清空
- https://blog.csdn.net/qq_25245961/article/details/77414134 这个也可以看看, 很好的输入参照文章。