|
ACM模式下的输入输出相关知识点
其中,可以通过这几个函数入门acm模式下的输入:
#include<iostream>
#include<bits/stdc++.h>//这个库很6
#include <string>
using namespace std;
//这是模板的使用,可以输出vector里面的东西
template <typename T>
void myprint(vector<T> a){
for(auto x:a){
cout<<x<<&#34; &#34;;}
}
//这两个函数是输入数组
void func_num(){
int n;
cin>>n;//这是知道长度的输入模式
vector<int> v(n);//生成一个长度是n的vector
for(int i=0;i<n;i++){
cin>>v;
}
myprint(v);
}
void func_num2(){
vector<int> v;
int x=0;
while(cin>>x){//这是不知道长度的输入模式
v.push_back(x);
if(cin.get()==&#39;\n&#39;){//终止条件
break;
}
}
myprint(v);
}
void func_string(){//这个函数可以读取一行的数据
vector<string> v;
string s;
getline(cin,s);
stringstream input(s);
while(input>>s){//循环向着里面输入东西,然后东西被收到vector里面
v.push_back(s);
}
myprint(v);
}
void func_string2(){//这是读取多行
vector<string> v;
string s;
//getline是读取一整行到某个字符串中
while(getline(cin,s)){
if(s==&#34;&#34;){//这是终止条件,cin.get读取字符
break;
}
stringstream data(s);//stringstream函数的作用是分隔开 ,然后可以挨个导入到s2中
string s2;
while(data>>s2){
v.push_back(s2);
}
}
myprint(v);
}
//这是读取多行数字然后保存在vec中
void func_n_line_num(){
vector<int> v;
string s;
while(getline(cin,s)){//getline可以一次读入一行,从cin中读到s中
if(s==&#34;&#34;){
break;//这是终止条件
}
for(auto &x:s){
if(x==&#39;,&#39;){
x=&#39; &#39;;
}
}
stringstream data(s);
string tmp;
while(data>>tmp){
v.push_back(stoi(tmp));//stoi是string转为int
}
}
myprint(v);
}
奇技淫巧
for_each函数
用法:
搬运一下:
#include<iostream>
#include<vector>
#include<algorithm>//这个头文件不可以忘了
using namespace std;
void MyPrint(int val)
{
cout<<val<<endl;
}
int main()
{
vector<int> v={1,2,3,4,5,7};
for_each(v.begin(),v.end(),MyPrint);
//MyPrint用来输出容器v里面的值
return 0;
}
迭代器用法
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int main(){
vector<int> v={1,23,4};//注意看vector怎么初始化
vector<int>::iterator it;//注意两个冒号
for(it=v.begin();it!=v.end();it++){
cout<<*it<<&#34; &#34;;
}
return 0;
}
普通容器
常见的函数
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
void myprint(int val){
cout<<val<<&#34; &#34;;
}
int main(){
vector<int> v={1,2,3};
v.push_back(5);
v.insert(v.begin(),18);//在某位置的前面插入一个数,注意这里某位置是迭代器(指针)
v.erase(v.begin()+1);
for_each(v.begin(),v.end(),myprint);
}
关联容器
关联容器首先看map和set
map用法:
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
void myprint(int val){
cout<<val<<&#34; &#34;;
}
int main(){
map<string,int> m;
m[&#34;Tom&#34;]=24;//这是第一种增加元素的方法
m.insert(make_pair(&#34;Jack&#34;,10));//这是另外一种增加元素的方法
for(auto it=m.begin();it!=m.end();it++){
cout<<it->first<<&#34; &#34;<<it->second<<endl;
}
return 0;
}
multimap用法:
multimap时map映射容器的一种,其拥有map的全部内容,并在此基础之上,multimap还具有了可以重复保存元素的功能,与上文的mutliset差不多,任何进行访问单个值得语句访问均只会返回第一个位置,这里不再多说,而是举一个实际中可能用得到得例子。
参考:
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
void myprint(int val){
cout<<val<<&#34; &#34;;
}
int main(){
multimap<string,int> m;
m.insert(make_pair(&#34;Alice&#34;,29));
m.insert(make_pair(&#34;Tom&#34;,24));
m.insert(make_pair(&#34;Tom&#34;,10));
m.insert(make_pair(&#34;Jack&#34;,90));
m.erase(&#34;Jack&#34;);//这是删除某键值对的方法1
auto label=m.begin();
for(auto it=m.begin();it!=m.end();it++){
if(it->first==&#34;Jack&#34;){
label=it;
}
}
m.erase(label);
//这是删除的方法2,用迭代器
for(auto it=m.begin();it!=m.end();it++){
cout<<it->first<<&#34; &#34;<<it->second<<endl;
}
//下面代码是输出里面叫tom的
string name=&#34;Tom&#34;;
multimap<string,int>::iterator it = m.find(name);//auto it也行,等号右边返回的是迭代器
for(int i=0;i<m.count(name);i++,it++){
//count这里返回的是数量
cout<<it->first<<&#34; &#34;<<it->second<<endl;
}
return 0;
}
unordered_map
参考:
unordered_map是一个将key和value关联起来的容器,它可以高效的根据单个key值查找对应的value。key值应该是唯一的,key和value的数据类型可以不相同。unordered_map存储元素时是没有顺序的,只是根据key的哈希值,将元素存在指定位置,所以根据key查找单个value时非常高效,平均可以在常数时间内完。unordered_map查询单个key的时候效率比map高,但是要查询某一范围内的key值时比map效率低。可以使用[]操作符来访问key值对应的value值。
set用法
set<int> a={0,1,2,9};
a.insert(6);
for(auto it = a.begin();it != a.end();it++) cout << *it;//输出01269
set<int> a = {0,1,2,9};
set<int> b = {3,4,5};
auto first = b.begin();
auto second = b.end();
a.insert(first,second);
for(auto it = a.begin();it != a.end();it++) cout << *it;
lambda用法
#include<bits/stdc++.h>
using namespace std;
auto f2=[](int a)->int{
return a+2;
};//这是规矩的写法,int和箭头都有
auto f=[=](int a){return a+1;};//不规矩
int main(){
cout<<f(1)<<&#34;,&#34;<<f2(1);
return 0;
}
参考: |
|