Advanced Search
Search Results
60 total results found
11-4 重載 [] 運算子
現在我們還缺一個重要的功能,那就是存取 Vec 裡的值。 試著執行這段程式看看。 [main.cpp] #include <iostream> #include "vec.h" using namespace std; int main() { Vec a; a.push_back(1); cout << "Cap:" << a.capacity() << " Size:" << a.size() << endl; a.push_back(3); cout << "Ca...
11-5 讓 Vec 可以儲存 int 以外的資料型別
目前我們 Vec 雖然可以動態成長,但是只能存放 int 型別的資料,這讓它變得很沒用。 明明只有型別不同,難道我們要寫一個 Vec_int 給 int 用,寫一個 Vec_double 給 double 用,......。 在這裡我們要使用一個新東西 樣版(template),class 是用來產生物件的 [模版],而 template 則是用來產生 class 的 [模版]。 你可以這樣想,在宣告時寫 Vec<int> 這時 template 就會幫我們生成一個可以儲存 int 的 class,宣告時寫 Vec...
12-1 為什麼需要 Iterator?
在學 STL 之前,我們通常用「下標」存取陣列: int a[] = {3, 1, 4, 1, 5}; for (int i = 0; i < 5; i++) { cout << a[i] << " "; } 容器種類很多(vector、list、set、map……),它們的內部結構不同。傳統的作法是針對不同的容器撰寫其存取元素的成員函數。但是這樣一來,每種容器都有自己的介面,對於寫程式的人來說是個很大的困擾。 Iterator(迭代器) 就是一個「統一的指標」,讓你用相同的寫法走訪不同的容器。
12-2 Iterator 的基本使用
一、取得 Iterator 函式 說明 v.begin() 指向第一個元素 v.end() 指向最後一個元素的下一位(不可解參考!) v.rbegin() 反向,指向最後一個元素 v.rend() 反向,指向第一個元素的前一位 v.end() 不是最後一個元素,是「越界哨兵(Sentry)」,只能用來判斷是否走完,不能 *v.end()! vector<int> v = {10, 20, 30, 40, 50}; vector<int>::iterator it; // 宣告...
12-3 Iterator 與 STL 演算法
和容器一樣,STL 也提供了很多通用演算法,適用於不同的資料型別和容器。 在使用 STL 的演算法時,除了要記得引入 <algorithm> 檔頭檔外,通常也需要提供一對 iterator,用來表示演算法作用的範圍。 用來表示範圍的 iterator,是左閉右開區間 [first, last) 一、常用的演算法 1. 排序 sort 排序所有元素 #include <algorithm> vector<int> v = {5, 3, 1, 4, 2}; sort(v.begin(), v.end()); ...