#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int>nums1; vector<int>nums2;
string s;
getline(cin,s);
stringstream ss;
ss<<s;
string temp;
while(getline(ss,temp,' '))
nums1.push_back(stoi(temp));
这里就是每次要重新定义 stringstream 就是stringstrem 第一次给他赋值 ok 第二次赋值就会失效 啥都没有了!!!! 重新定义
getline(cin,s);
stringstream ss2(s);
while(getline(ss2,temp,' '))
nums2.push_back(stoi(temp));
//完成输入,进入算法
int m=nums1.size(); int n=nums2.size();
vector<int>res(m+n);
int index=0,i=0,j=0;
while(i<m && j<n){
if(nums1[i]<=nums2[j]){
res[index++]=nums1[i++];
}
else
res[index++]=nums2[j++];
}
for(;i<m;)
res[index++]=nums1[i++];
for(;j<n;)
res[index++]=nums2[j++];
//
///输出
for(int k=0;k<res.size();k++){
cout<<res[k]<<' ';
}
}
#include<bits/stdc++.h>
using namespace std;
int main(){
int N,M;
cin>>N>>M;
cin.get(); //cin 输入中 回车不会吃掉 只是终止 getline 遇到回车就完犊子了 终止了,所以必须cin.get()
vector<vector<float> >res;
for(int i=0;i<N;i++){
string s;
getline(cin,s);
stringstream ss(s);
string temp;
vector<float>v;
while(getline(ss,temp,' ')){
v.push_back(stof(temp));
}
res.push_back(v);
}
cout<<res[1][2];
}
题目1: 输入第一行表示几个行,接下来每行2个数字,输出累加
#include<iostream>
using namespace std;
int main()
{
int n,a,b;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a>>b;
cout<<a+b<<endl;
}
return 0;
}
假设我们知道要输入比如N行4列,是空格隔开的,我们可以用:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a,b,c,d;
cin>>n;
vector<vector<int>>nums(n,vector<int>(2));
for(int i=0;i<n;i++)
{
cin>>a>>b>>c>>d;
nums[i].push_back(a);
nums[i].push_back(b);
nums[i].push_back(c);
nums[i].push_back(d);
cout<<a+b<<endl;
}
return 0;
}
注意到 while(cin>>a>>b)中,一直跳不出去,所以最多执行while里面额程序,而c=getchar()!=’\n’是可以跳出去的,getline也跳不出去 反正记住就行!
注意到cin>>a>>b或者连续两行的cin都是没事的,但是cin.get(ch),ch只能是char或者ch=cin.get(),当cin之后用回车,回车存在缓存区,cin.get时候会被终止因此忽略,所以要用cin.get()或者cin.ignore()来忽略吃掉这个回车.对cin来说回车就是停止吃的过程然后存入缓存区,但是再次吃的时候是缓存区不管,他是忽略回车的! 总之 循环的时候还是啥的不要用getchar 问题很大 就cin好了或者知道个数的话就for循环。不知道个数的话getline while起来,退不出去看题目给什么条件能break
说白了就是getline 或者cin的for循环!
题目2:A+B输出4
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int count;
int res;
int sum=0;
while(cin>>count){
if(count==0)
break;
for(int i=0;i<count;i++){
cin>>res;
sum+=res;
}
cout<<sum<<endl;
sum=0;
}
return 0;
}
while(cin>>n)这种少用,除非有break的。这边显示如何跳出去的。
A+B输出5
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>res;
int linecount = 0;
cin>>linecount;
while(linecount>0)
{
int numcount = 0;
cin>>numcount;
int sum = 0;
for(int i = 0; i < numcount;i++)
{
int num = 0;
cin >> num;
sum += num;
}
res.push_back(sum);
linecount--;
}
for (auto i : res)
{
cout << i << endl;
}
return 0;
}
牛客输入输出6经典!:
#include<iostream>
#include<string>
#include<vector>
#include<cstring>
#include<sstream>
#include<numeric>
using namespace std;
int main()
{
string str;
vector<vector<int>>res;
vector<int> ans;
while(getline(cin,str))
{
if(str.empty())
break;
ans.clear();
string temp;
stringstream ss(str);
while(getline(ss,temp,' '))//没有默认参数或者加空格就是ss输出给temp遇到空格就结束,结束输入,但是geiline还在因为这里不是cin,所以就一行getline完毕就结束了。
{
ans.push_back(stoi(temp));
}
res.push_back(ans); //res 是为了造出2维数组,用 stringstream来用于split很方便
cout<<accumulate(ans.begin()+1,ans.end(),0)<<endl;
}
return 0;
}
注意到,对 while(getline(ss,temp,’ '))中的第三个参数设置,或者;就能实现以这个为分界线对任意行信息进行读取了!!!不用调用子函数,而且读取是不断读取的!!记住 直到行数可以for循环,每个for进行getline,注意到这个框架有2个getline,第一次是cin进去,第二次的gerline只是为了让stringstream获得哪一行数据
注意到
https://www.cnblogs.com/zhang-qc/p/9048977.html
https://blog.csdn.net/liitdar/article/details/82598039
讲解了sstream的用法,可以看看。简单概括就是stringstream 用>>输出元素给别人,<<给他赋值元素,ss.clear():ss.str(xx)是比较场用的组合。 ss.clear()用来清空当两次赋值对象类型不同时,ss.str(“”)不加参数加双引号就是字符串的清空,两次赋值对象都是字符串。ss.str()用来表示ss的全部值,输出的时候用。
注意到streamstring 类型他有个if (ss.fail()),一般用来判断是否走完,我们用上面的while可以实现,但是一些特殊场合,如下代码所示,可见streamstring具备自动识别的功能,可以看到str字符串形式输入给ss后他输出的时候具备自动转换的功能,我输出给temp和ch他会自动根据数据进行转换!如果没有那就是按照空格走了。但是如果使用getline(ss,temp,’ ')只能转换为字符串形式~
还有个就是每次走完一个小段ss相当于就前进这一段,空格也删掉。正常输出3次,但是这个程序会输出4次,最后一次重复,这是由于反正ss最后一次了,他还会输出下上次缓存的区域,但是此时fail标志位必须等走完才true,所以就能读,所以在读之后再判断fail,
总结就是,fail是第四次读的时候遇到失败了,才开始变质,但是还是企图读,所以强行从上次缓存区读取了。fail不是自动fail的,是检测读取是否fail操作。
int main() {
stringstream ss;
string str;
str = "999:97 42:22 44:102300";
ss << str;
char ch;
int temp, temp1;
while (1) {
if (ss.fail()) {
break;
}
ss >> temp >> ch >> temp1;
cout << temp << ":" << temp1 << endl;
}
return 0;
}
输出:
999:97
42:22
44:102300
44:102300
程序修改为:
#include<iostream>
#include<string>
#include<vector>
#include<cstring>
#include<sstream>
#include<numeric>
using namespace std;
int main() {
stringstream ss;
string str;
str = "999:97 42:22 44:102300";
ss << str;
char ch;
int temp, temp1;
while (1) {
ss >> temp >> ch >> temp1;
if (ss.fail()) {
break;
}
cout << temp << ":" << temp1 << endl;
}
return 0;
}
/
输出:
999:97
42:22
44:102300
或者改成这样也是对的:,为什么放到while循环就对了呢?这是由于读都是可以读N+1次,但是第N+1次是强行读的,在while的执行中出现了不一样的操作,是缓存区出来的,所以会终止的。
#include<iostream>
#include<string>
#include<vector>
#include<cstring>
#include<sstream>
#include<numeric>
using namespace std;
int main()
{
stringstream ss;
string str;
str = "999:97 42:22 44:102300";
ss << str;
char ch;
int temp, temp1;
while (ss >> temp >> ch >> temp1)
{
cout << temp << ":" << temp1 << endl;
}
cin.ignore();
return 0;
}
或者用我的老办法就是:
#include<bits/stdc++.h>
using namespace std;
vector<int> helper(string s);
int main(){
int n;
string s;
vector<int> nums;
vector<vector<int>> ans;
while(getline(cin,s)){
if(s=="")
break;
nums.clear();
nums=helper(s);
ans.push_back(nums);
cout<<accumulate(nums.begin()+1,nums.end(),0)<<endl;
}
return 0;
}
vector<int> helper(string s){
string temp;
vector<int>res;
for(int i=0; i<s.size();i++){
if(s[i]!=' ')
{
temp=temp+s[i];
}else{
res.push_back(stoi(temp));
temp.clear();
}
}
res.push_back(stoi(temp));
return res;
}
牛客输入输出8:字符串排序(1)
题目:
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<string> arr;
for (int i = 0; i < n; i++) {
string tmp;
cin >> tmp;
arr.push_back(tmp);
}
sort(arr.begin(), arr.end()); //字符串的排序是按照首字母来排序把反正就是
for (string s: arr) {
cout << s << " ";
}
}
牛客输入输出9:字符串排序(2)
#include<bits/stdc++.h>
using namespace std;
int main() {
string str;
string temp;
vector<string> ans;
while(getline(cin,str)){
ans.clear();
stringstream ss(str);
while(getline(ss,temp,' ')) //在这个geline的过程中,注意到getline重复一个元素会吞没他的值所以不用清空temp
ans.push_back(temp);
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++)
cout<<ans[i]<<' ';
cout<<endl; //注意 因为没有回车,报错了!因为我输入一行,回车就输出一行下次你怎么办!
//提前回车给下一行输入啊要。。。
//也就是说回车一般在输出这个地方留意啊
}
return 0;
}
牛客输入输出10:字符串排序(3)
#include<bits/stdc++.h>
using namespace std;
int main(){
string str;
string temp;
vector<string> res;
while(getline(cin,str)){
stringstream ss(str);
res.clear();
while(getline(ss,temp,',')){
res.push_back(temp);
}
sort(res.begin(),res.end());
for(int i=0;i<res.size()-1;i++)
cout<<res[i]<<',' ;
cout<<res[res.size()-1]<<endl ;
}
return 0;
}
牛客输入输出12:
备注: 这个题目不难但是一直不能通过第二个测试案例,发现是数字太大了,这个时候找了下,可以用stol 字符转换为long类型,而不是stoi,但是注意到accumulate也是int的累加,有点问题的。所以直接用sum来操作了。还有个就是 char-'0’变数字 包括 数字+'0’变成char只能针对1个字符或者数字的情况操作
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
while(getline(cin,s)){
stringstream ss(s);
string temp;
vector<long> num;
long sum=0;
while(getline(ss,temp,' ')){
num.push_back(stol(temp));
sum+=stol(temp);
}
cout<<sum<<endl;
}
return 0;
}