參考理解了下,實現上有不同。
最開始僅是查詢某個單詞所在的行數。
文字儲存到記憶體,選擇vector
map資料結構儲存查詢結果 map
真正的物件導向,類關係:
query_basewordquery
notquery
binaryquery
andquery
orquery
wordquery解決單個查詢
query隱藏繼承細節,核心成員是乙個指向基類的base指標.
核心思想就是封裝基類指標!,然後靈活的呼叫下面的函式.
queryresult eval(textquery & t);
問題最後抽象成為乙個布林查詢表示式:
query q = ~(query("good") | (query("boy") & query("girl")));
queryresult r= q.eval(textquery("***.file");
本質上就是虛函式裡再呼叫虛函式,形成層次, 最外層的優先順序最低(~),括號擴起來的優先級別最高(&).
q.eval –>notquery::eval notquery裡的基類指標,指向了乙個orquery繼續做andquery::eval的and動作orquery::eval, 含有兩個指標,乙個指向wordquery,乙個指向andquery,
因此分別呼叫了wordquery::eval和andquery::eval
wordquery::eval 檢查單詞「good」
andquery::eval 又含2個指標(query物件),指向2個wordquery
wordquery::eval 檢查單詞「boy」
wordquery::eval 檢查單詞「girl」
繼續做orquery::eval的or動作
繼續做notquery::eval未完成的not動作
例如 query | query: 操作返回乙個query, 用派生類的指標構造。
friendly query operator|(const query a, const query b)
//這裡是隱式轉換,呼叫下面的轉換建構函式
query(query * ptr) : base(ptr) {}
orquery派生自binaryquery,因此派生類的構造又是呼叫了基類的建構函式
orquery(query a, query b) : binaryquery(a,b,"|") {}
binary將a,b,儲存到自己的成員變數query left和query right中。
在建立表示式的query時,相當於query* base = new orquery(…);需要手動釋放,用智慧型指標解決手動釋放的問題。
另外定義乙個類為share_ptr和直接定義乙個物件 使用上其實並沒有區別,
shared_ptr ptrc;
class * c;
class c;
區別在:
1 記憶體維護上,ptrc可以自動管理記憶體釋放,指標分配的記憶體需要delete,普通物件跟隨生命週期自動析構
2 資源上,物件賦值時發生拷貝,shared_ptr和指標共享;
3 生命週期share_ptr取決引用值,指標delete,而且必須在定義他的類物件結束之前,
普通物件跟隨定義他的類的生命週期
5文字溢位
文字溢位 overflow visible 預設值 hidden 超出隱藏 scroll 顯示滾動條 auto 自適應檢視 inherit 繼承父元素overflow值文字換行 white space normal 預設值 pre 原格式輸出,空白會被瀏覽器保留 pre wrap 文字不會換行,文字...
336 文字壓縮
中文english 給你乙個只含有可見字元 ascii 碼範圍 3232 至 126126 文字檔案,檔案中可能出現一些重複的單詞,你需要對它們進行壓縮。壓縮規則如下 如果原檔案中的字元不是英文本元,那麼保留這些字元。我們將連續的英文本元視為乙個單詞,單詞的前後不應該還有其它的英文本元。輸入 ple...
The HTML Language 二 文字標誌
後面的標誌 對 未經特別說明,均用在 之間1.標誌對是用來建立乙個段落 段與段之間空一行 在此標誌對之間加入的文字將按照段落的格式顯示在瀏覽器上 標誌還可以使用 align 屬性,它用來說明對齊方式 格式 left 左對齊center 居中right 右對齊2.是乙個很簡單的標誌,它沒有結束標誌,它...