Advanced Search
Search Results
45 total results found
10-4 Class 練習題
練習一:電影票券(Ticket) 情境說明 你正在設計一套電影院售票系統。每張票券記錄了電影名稱、座位號碼、票價,以及是否已被使用。票券一旦使用就不能再次入場;票價不能設為負數。 規格列表 成員變數(皆為 private) 變數名稱 型態 說明 movieName string 電影名稱 seatNumber int 座位號碼 price int 票價(元) used bool 是否已使用 建構子 建構子 初始值 Ticket() movieName="未命名"、se...
11-1 規劃我們的 Vec 類別
一、Vec 類別需要什麼? 在這個章節裡,我們嘗試自己建立一個簡單版的 vector,一個叫做 Vec 的類別。 我們至少需要以下三項屬性: data: 指向一塊儲存資料的記憶體空間 size: 記錄目前 Vec 裡的元素數量 capacity: 記錄目前 Vec 裡己向作業系統要求配置的空間大小 接下來考慮需要對外公開的成員函數。 Vec(): 建構函數 ~Vec(): 解構函數 size(): 回傳目前 Vec 裡有幾個元素 capacity(): 回傳目前 Vec 配置的記憶體大小最多可...
11-2 實作 Vec 的細節
一、建構與解構函數 在建構函數中,我們要初始化 Vec 的 data member。因為剛建立好的 Vec 會是一個空的容器,所以一開始 m_size 和 m_capacity 都是 0。而 m_data 則先賦予它 nullptr 值,表示目前沒有指向任何記憶體。 Vec::Vec() { m_data = nullptr; m_size = 0; m_capacity = 0; } 在解構函數部分,我們先檢查是不有向作業系統要求配置記憶體,若有的話 m_data 將不會是 nullpt...
11-3 測試 Vec 類別
目前我們的 Vec 類別如下: [vec.h] #ifndef VEC_H_INCLUDED #define VEC_H_INCLUDED class Vec { private: int *m_data; int m_size; int m_capacity; public: Vec(); ~Vec(); int size(); int capacity(); void push_back(int val); void pop_back()...
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()); ...