一、sstream头文件运用
题目:输入数据的每行包括若干个(至少一个)以空格隔开的整数,输出每行中所有整数之和。
#include<iostream>
#include<cstring>
#include<sstream>
using namespace std;
int main()
{
string line;
while(getline(cin,line)){
int sum=, x;
stringstream ss(line); //创建一个“字符串流”——ss
while(ss>>x) sum+=x; //像读取cin那样读取ss
cout<<sum<<endl;
}
}
二、再谈结构体struct
新的定义方式:
struct Point{
//code
};
特点:在struct内可以有成员函数。
struct Point{
int x,y;
Point(int x=,int y=):x(x),y(y) {} //默认参数,即Point()相当于Point(0,0)。
//函数Point无返回值,称为构造函数,其是在声明变量时调用的。
//“:x(x),y(y)”是一个简单的写法,表示把成员变量x初始化为参数x,成员变量y初始化为参数y。
};
与C++结合:可以重载运算符,为结构体定义“加法”,为结构体定义流输出方式。
struct Point{
int x,y;
Point(int x=,int y=):x(x),y(y) {} //也可写成Point(int x=0,int y=0){this->x=x;this->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;
}
应用举例:
#include<iostream>
using namespace std;
struct Point{
int x,y;
Point(int x=,int y=):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(,);
a.x = ;
cout<< a+b <<endl; //输出(4,2)
}
三、模板
没有模板的求和:只能求一种数据类型数组的和。
int sum(int* begin, int* end)
{
int *p = begin;
int ans = ;
for(int *p = begin; p != end; p++)
ans += *p;
return ans;
}
使用模板:下述函数可以给double数组和Point数组求和。
template<typename T>
T sum(T* begin, T* end)
{
T *p = begin;
T ans = ;
for(T *p = begin; p != end; p++)
ans = ans + *p; //Point结构体中没有定义"+="运算符。
return ans;
}
int main()
{
double a[] = {1.1, 2.2, 3.3, 4.4};
cout<<sum(a,a+)<<endl;
Point b[] = {Point(,), Point(,), Point(,), Point(,)}; //结构体数组
cout<<sum(b,b+)<<endl;
}
带模板的结构体:将上述的结构体Point编程模板。
template <typename T>
struct Point{
T x,y;
Point(T x=,T y=):x(x),y(y) {}
};
template <typename T>
Point<T> operator + (const Point<T>& A, const Point<T>& B){
return Point<T>(A.x+B.x,A.y+B.y);
}
template <typename T>
ostream& operator << (ostream &out, const Point<T>& p){
out<<"("<<p.x<<","<<p.y<<")";
return out;
}
int main()
{
Point<int> a(,), b(,);
Point<double> c(1.1,2.2), d(3.3,4.4);
cout<<a+b<<" "<<c+d<<endl; //输出(4,6) (4.4,6.6)
}