首先说明这两个并没有关联,只是在一起看了罢了
一、sstream
复习下getline的用法,可以直接读入一行,包括空格
考虑这样一个题目:输入数据的每行包含若干个以空格隔开的整数,输出每行中所有整数之和。
(如果只能使用字符和字符数组,一般有两种方案:一是使用getchar()边读边算,代码较短,但容易写错qwq;二是每次读取一行再扫描该行的字符同时计算结果,但如果使用C++,代码可以很简单)
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
string line;
while(getline(cin, line)){
int sum = 0, x;
stringstream ss(line);
while(ss >> x) sum += x;
cout<<sum<<'\n';
}
return 0;
}
stringstream在sstream头文件中,用getline读取的一行创建一个“字符串流”——ss.接下来只需要像读取cin那样读取ss即可。【可以把string作为流进行读写,定义在sstream中】
【虽然string 和 sstream 都很方便,但string很慢,sstream更慢,应谨慎使用】
二、“再谈”结构体
先上代码:
#include<iostream>
using namespace std;
struct Point{
int x,y;
Point(int x=0, int y=0):x(x),y(y){} //构造函数
};
Point operator + (const Point& A, const Point& B){
return Point(A.x+B.x, A.y+B.y);
}
ostream& operator << (ostream &out, const Point& p){
out <<"(" <<p.x <<"," <<p.y <<")";
return out;
}
int main(){
Point a, b(1,2);
a.x=3;
cout<< a+b <<'\n';
return 0;
}
构造函数(ctor)是在声明变量时调用的,声明Point a, b(1,2)时分别调用了Point()和Point(a,b), "=0"的0为默认值,所以Point()==Point(0,0).":x(x),y(y)"是一个简单写法,表示“把成员变量x初始化为参数x,成员变量y初始化为参数y”.也可以写成:
Point(int x=0, y=0){this->x = x, this->y = y;}
这里的this是指向当前变量的指针。this->x意思是“当前对象的成员变量x”,即(*this).x。
后面就是运算符重载了,搜了一下ostream:
ostream表示输出流,英文"output stream"的简称.在 C++中常见的输出流对象就是标准输出流cout,很少自定义ostream的对象,更多的是直接使用cout。但"<<"只能输出整型、实型等普通类型,而对自定义的类型进行输出,就可以这样干了,写法都是一样的,只要重载<<操作符,配合ostream一起使用即可。(“该方法还可以扩展到其他很多地方”)