首页 > 代码库 > 初涉算法——C++

初涉算法——C++

一、sstream头文件运用

题目:输入数据的每行包括若干个(至少一个)以空格隔开的整数,输出每行中所有整数之和。

#include<iostream>
#include<cstring>
#include<sstream>
using namespace std;
int main()
{
    string line;
    while(getline(cin,line)){
        int sum=0, 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=0,int y=0):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=0,int y=0):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;
}

应用举例:

 1 #include<iostream>
 2 using namespace std;
 3 struct Point{
 4     int x,y;
 5     Point(int x=0,int y=0):x(x),y(y) {}    
 6 }; 
 7 Point operator + (const Point& A, const Point& B){
 8     return Point(A.x+B.x,A.y+B.y);
 9 }
10 ostream& operator<<(ostream &out, const Point& p){
11     out<<"("<<p.x<<","<<p.y<<")";
12     return out;
13 }
14 int main()
15 {
16     Point a, b(1,2);
17     a.x = 3;
18     cout<< a+b <<endl;        //输出(4,2) 
19 }

三、模板

没有模板的求和:只能求一种数据类型数组的和。

1 int sum(int* begin, int* end)
2 {
3     int *p = begin;
4     int ans = 0;
5     for(int *p = begin; p != end; p++)
6         ans += *p;
7     return ans;
8 }

使用模板:下述函数可以给double数组和Point数组求和。

1 template<typename T>
2 T sum(T* begin, T* end)
3 {
4     T *p = begin;
5     T ans = 0;
6     for(T *p = begin; p != end; p++)
7         ans = ans + *p;            //Point结构体中没有定义"+="运算符。 
8     return ans;
9 }
1 int main()
2 {
3     double a[] = {1.1, 2.2, 3.3, 4.4};
4     cout<<sum(a,a+4)<<endl;
5     Point b[] = {Point(1,2), Point(3,4), Point(5,6), Point(7,8)};    //结构体数组 
6     cout<<sum(b,b+4)<<endl;
7 }

带模板的结构体:将上述的结构体Point编程模板。

 1 template <typename T> 
 2 struct Point{
 3     T x,y;
 4     Point(T x=0,T y=0):x(x),y(y) {}    
 5 }; 
 6 template <typename T> 
 7 Point<T> operator + (const Point<T>& A, const Point<T>& B){
 8     return Point<T>(A.x+B.x,A.y+B.y);
 9 }
10 template <typename T> 
11 ostream& operator << (ostream &out, const Point<T>& p){
12     out<<"("<<p.x<<","<<p.y<<")";
13     return out;
14 }
1 int main()
2 {
3     Point<int> a(1,2), b(3,4);
4     Point<double> c(1.1,2.2), d(3.3,4.4);
5     cout<<a+b<<" "<<c+d<<endl;       //输出(4,6) (4.4,6.6) 
6 }

初涉算法——C++