5. C++與STL入門

從C到C++

  1. C++模板
    • C++版的“a+b程序”
      #include<cstdio>
      
      int main() {
          int a, b;
          while (scanf("%d%d", &a, &b) == 2) 
              printf("%d\n", a+b);
          return 0;
      } 
      
      C++能編譯大多數C語言程序。雖然C語言中大多數頭文件在C++中仍然可以使用,但推薦方法是在C頭文件之前加一個小寫的c字母,然後去掉.h後綴。
    • 稍微複雜點的程序
      #include<iostream>
      #include<algorithm>
      using namespace std;
      const int maxn = 100+10;
      int  A[maxn];
      int main() {
          long long a, b;
          while(cin >> a >> b){
              cout << min(a, b) << "\n";
          }
          return 0;
      }
      
      iostream 提供了輸入輸出流,而algorithm提供了一些常用的算法,例如代碼中的min
      cin>> a的含義是從標註中讀取a,它的返回值是一個“已經讀取了a的新流”,然後從這個新流中繼續讀取b。
      C++流最大的缺點就是運行太慢,以至於很多競賽題目會在題面中的顯著位置註明:本題的輸入量很大,請不要使用C++的流輸入。
      using namespace std ,C++中可以使用流簡化輸入輸出操作。標準輸入輸出流在頭文件iostream中定義,存在於名稱空間std中。如果使用了using namespace std語句,則可以直接使用。
      聲明數組時,數組大小可以使用const聲明的常數(在C99中是不允許的)。
  2. 引用
    • 交換變量
      #include<iostream>
      using namespace std;
      
      void swap2(int& a, int& b){
          int t = a; a = b; b = t;
      }
      
      int main(){
          int a = 3, b=4;
          swap(a, b);
          cout << a << " " << b << "\n";
          return 0;
      }
      
      如果在參數名前加一個“&”符號,就表示這個參數按照傳引用(by reference)的方式傳遞,而不是C語言裏的傳值。這樣,在函數內改變參數的值,也會修改到函數的實參。
      C++中的引用就是變量的“別名”, 它可以在一定程度上代替C中的指針。例如,可以用“傳引用”的方式讓函數內直接修改實參。
  3. 字符串
    C++提供了一個新的string類型,用來替代C語言中的字符串數組。
    C++在string頭文件裏定義了string類型,直接支持流式讀寫。string有很多方便的函數和運算符,但速度有些慢。
    • 輸入數據的每行包含若干個以空格隔開的整數,輸出每行中所有整數之和。
      #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; 
      } 
      
      string類在string頭文件中,而stringstream在sstream頭文件中。首先用getline函數讀一行數據,然後用這一行創建一個“字符串流”———ss。接下來只需像讀取cin那樣讀取ss即可。
      雖然string和sstream都很方便,但string很慢,sstream更慢,應謹慎使用。
  4. 再談結構體
    C++除了支持結構體struct之外,還支持class。
    C++中的結構體可以有一個或多個構造函數,在聲明變量時調用。
    C++中的函數參數可以擁有默認值。
    C++結構體的成員函數中,this是指當前對象的指針。
    #include<iostream>
    using namespace std;
    
    // 結構體 
    struct Point{
        int x, 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;
    } 
    
    int main() {
        Point a, b(1,2);
        a.x = 3;
        cout << a+b << "\n";
        return 0;
    }  
    
  5. 模板
    模板可以讓我們在調用函數時,同時使用int型,double型。
    例如:
    #include<iostream>
    using namespace std;
    
    template <typename T>
    struct Point{
        T x, y;
        Point(T x=0, T y=0){
    	    this->x = x;
    	    this->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(1,2);
        Point<double> c(1.1, 2.2), d(3.3, 4.4);
        a.x = 3;
        cout << a+b << "\n" << c+d ;
        return 0;
    }
    

待更。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章