Time of Update: 2018-07-25
導言 運算式求值 演算法 演算法具體實現 導言 運算式求值是程式設計語言中的一個最基本問題。本次實現採取“算符優先法”。 運算式求值 如何一個運算式都是由運算元、運算子和界限符組成的,我們稱為單詞。一般地,運算元既可以是常數也可以是被說明為變數或常量的標識符;運算子可以分為算術運算子、關係運算子和邏輯運算子3類;基本界限符有左右括弧和運算式結束符等。
Time of Update: 2018-07-25
一. 舉例 一般汽車發動機工作時有四種狀態,吸氣、壓縮、做功和排氣。 在運行時,不同的狀態會有不同的行為,當前的狀態機器在適當的時候會過渡到下一狀態。 其實使用者在使用時根本不知道當前的狀態,也無需知道當前的狀態。使用者只需要給發動機一個初始狀態,最後得到一個停止狀態就行了。 結構圖如下: 代碼如下: //狀態class State{public: virtual void Operation(Work *work)
Time of Update: 2018-07-25
本文可轉載,轉載請註明出處:http://www.cnblogs.com/collectionne/p/6815924.html。 前面的一篇文章我們講了用Windows API遍曆一個目錄下的所有檔案,這次我們講用一種Windows/Linux通用的方法遍曆一個目錄下的所有檔案。
Time of Update: 2018-07-25
添加標頭檔#include <wininet.h> 附加庫:#pragma comment(lib,"Wininet.lib") // 發送 int GetURLInternal(LPCSTR lpszUrl, std::string& content){int result = -1;HINTERNET hSession = InternetOpenA(NULL,INTERNET_OPEN_TYPE_DIRECT, NULL,
Time of Update: 2018-07-25
狀態模式:屬於行為型模式的其中一種,其允許一個對象在內部改變狀態時改變它的行為,對象看起來似乎修改了它的類。 狀態模式主要解決的是當控制一個對象的狀態轉換條件運算式過於複雜時的情況,把狀態的邏輯判斷轉移到表示不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。好處就是講於特定狀態相關的行為局部化,並且將不同的狀態行為分割開來。比如說我們有一個DoSomeThing的函數,該函數內有大量的if else 分支或者case分支,函數在不同的分支下執行不同的操作。在編程中有一個基本的準則是代碼壞味道,
Time of Update: 2018-07-25
概述:
Time of Update: 2018-07-25
上篇部落格中我們講了返回一個reference對象可能會出錯或者效率特別低,那有沒有比較適合返回reference引用的情況呢。下面我們就來總結一下類型: 1)函數傳回值用引用,參數傳遞進去也用引用: int& hel(int& t){ return t;} 2)函數傳回值用引用,參數傳遞用指標 int& hel(int *t){ return *t;} 3)返回函數內部的資料: copy assignment運算子
Time of Update: 2018-07-25
條款11:在**重點內容**operator=中處理“自我賦值” “自我賦值”發生在對象被賦值給自己時: class Widget{…} Widget w; … w=w;//賦值給自己 a[i]=a[j];//潛在的自我賦值,如果i和j有相同的值,這便是個自我賦值 *px=*py;//潛在的自我賦值,如果px和py指向同一個問題,這也是自我賦值 甚至如下這樣也可以: class Base {…}; class Derived:public Base {…}; void
Time of Update: 2018-07-25
詳情見:https://zcheng.ren/2016/08/16/STLAllocater/ STL的實現中,空間配置器是重中之重唉,因為整個STL的操作對象放在容器內,怎樣為容器配置空間使得容器得以存放資料呢。這時候我們就需要配置器Alloc進行處理了。 空間配置器Alloc包括哪些方面呢。 空間配置器將記憶體的配置。釋放與對象的構造和析構釋放分開,因此STL的空間配置器包括分兩個部分進行講解: 1、對象的構造和析構
Time of Update: 2018-07-25
我們知道,平衡二叉樹要求二叉樹的左右子樹的深度差不超過1,即可以取值為{-1,0,1},同時,空樹也為平衡二叉樹,知道了這些,我們可以方便的進行平衡二叉樹的判定,實現代碼如下: 即定義一個求樹的深度的一個函數,我們使用遞迴進行定義,然後我們定義判定樹是否為平衡二叉樹的函數,同樣使用遞迴定義,因為平衡二叉樹的左右子樹一定為平衡二叉樹。 class Solution {public: bool isBalanced(TreeNode *root) { if(!root)
Time of Update: 2018-07-25
C++中,const對象只能調用const成員函數,原因是什麼呢。下面我們針對如下例子並對其進行分析進而理解其中緣由: #include <iostream>#include <string>using namespace std;class MyInt{private: int i;public: MyInt(){ } MyInt(int i) :i(i){ } MyInt& operator++(){
Time of Update: 2018-07-25
參考:《one-day-one-leetcode》 需要求出多個字串的最長前置詞字元串,即求出最小的字串,然後求出最小字串的長度和對應的字串,然後在最短字串的長度內進行和其他字串的匹配即可。 #include <iostream>#include <string>#include <vector>using namespace std;string longestCommonfix(vector<string>& strs){
Time of Update: 2018-07-25
C語言中提供了兩種類型轉換: 1)隱式類型轉換:進行隱式類型轉換; 2)顯示類型轉換:使用(type)expression或者type(expression)(PS:這種表示主要用於傳遞的參數是類類型而類的建構函式是explicit的)這種表示,由一堆小括弧加上一個對象名稱組成,難以辨識。 C++中為瞭解決C語言中的舊式類型轉換,定義了4種新式類型轉換,分別是: 1)static_cast;2)const_cast;3)dynamic_cast;4)reinterpret_cast。
Time of Update: 2018-07-25
條款29:為“異常安全”而努力是值得的 在進行今天“異常安全”討論主題之前,我們先來看看如下代碼: class PrettyMenu{public: ... void changeBackground(std::istream& imgSrc); ...private: Mutex mutex; Image* bgImage; int imageChanges;};void
Time of Update: 2018-07-25
條款31:將檔案間的編譯依存關係降至最低 問題提出:如果我們將某個class的實現檔案做了某些修改,修改並不是class的介面,而是其實現部分,而且只改了其private部分,然後重建整個檔案,然鵝當你進行編譯的時候,可以發現該類都被重新編譯和連結了,什麼鬼。。。 問題的原因是C++並沒有“將介面從實現中分離”該部分做的很好,class的形式不僅包括介面,同時還包括十足的實現項目,如: class Person{public: Person(const std::string&
Time of Update: 2018-07-25
詳情:https://zcheng.ren/2016/08/24/STLList/ C++實現了vector之後由於無法是實現快速刪除和插入元素,因此STL設計者便提出用list解決這一問題:通過在記憶體中不連續的空間分配節點,通過連結進行操作,便可以快速實現這一優點。 list的節點包括:指向前一節點的指標prev,指向後一節點的指標next; iterator用指向list節點的指標實現即可。 注意:
Time of Update: 2018-07-25
條款21:必須返回對象時,別妄想返回其reference 上篇部落格我們講了pass-by-value效率特別低,除了一些特定情況時,盡量在傳遞參數的時候使用pass-by-reference-to-const,因此,有的小夥伴就走向了一個極端,堅定追求pass-by-reference純度,以至於對於傳回值也想設定為引用,然鵝物極必反,不用太追求極端的。下面我們來看一些例子,撥開各位小夥伴心中的迷霧。 class Rational{public: Rational(int
Time of Update: 2018-07-25
參考:《one-day-one-leetcode》 問題描述:給定一個向量vec,求取vec中三個數組的和與給定元素target最接近,輸出該值。 我們對於這種問題有兩種思路,一種是直接利用暴力演算法求解,通過三重迴圈一直讓其不斷尋找,直至找到和尋找值最接近的值;第二種方式是利用智能方法求解,不斷地將值所能取得的範圍縮小,然後逐步求解,但是這裡需要注意注意i->i+1的變換,需要保持key不變。 #include <iostream>#include
Time of Update: 2018-07-25
【 聲明:著作權,轉載請標明出處,請勿用於商業用途。 聯絡信箱:libin493073668@sina.com】 9.1 順序容器概述 1.順序容器類型 vector 可變大小數組。支援快速隨機訪問。在尾部之外的位置插入或刪除元素可能很慢。 deque
Time of Update: 2018-07-25
參考《one-day-one-leetcode》 在上篇部落格中我們討論了將1~3999以內的數字轉化為羅馬數字,著重討論了非7個標準的羅馬數位一些表達,例如4,6,3等等的表達,這篇部落格我們著討論一下將羅馬數字轉化為整型數位情況。 其實我們在進行轉化的時候主要注意一下4,40,400,等數位表達即可。 代碼: #include <iostream>#include <string>#include <vector>using