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