本篇博文主要參考:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/22/2603525.html STL(Standard Template Library),是C++的一個高效的標準模板庫,主要包括了: ①容器;②迭代器;③演算法;④仿函數;⑤迭代適配器;⑥空間適配器(allocator)主要包括對象的建立和銷毀以及記憶體的擷取和釋放兩個部分。 - 1、STL容器:
條款20:寧以pass-by-reference-to-const替換pass-by-value 預設情況下C++以by value方式(一個繼承自C的方式)傳遞對象至(或來自)函數。除非你另外指定,否則函數參數都是以實際實參的複件為初值,調用端獲得的亦是函數傳回值的一個複件。複件(副本)的產生需要花費時間,浪費資源,參看如下代碼。 #include <iostream>#include <string>using namespace std;class
【 聲明:著作權,轉載請標明出處,請勿用於商業用途。 聯絡信箱:libin493073668@sina.com】 1.1 編寫一個簡單的C++程式 1.一個函數的定義包含四部分:傳回型別,函數名,形參列表,函數體。 2.當return語句包括一個值時,此傳回值的類型必須與函數的傳回型別相容。
我們需要判斷從根節點到分葉節點的所有路徑,並對每條路徑上的節點從根節點到分葉節點不斷乘10操作,類似於將字串轉化為int操作,具體問題見:https://www.nowcoder.com/practice/185a87cd29eb42049132aed873273e83?tpId=46&tqId=29051&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking,下面進行求解: /** *
終於有時間啦,可以將以前挖的坑填啦。 C++中的static與C語言有什麼不同呢。我們指導C++語言添加了OOP思想,相對於C語言中的static有了新的引用情境,下面我們就來分析一下C++中C語言部分的static屬性和C++ OOP部分的static屬性。 C語言部分static: 1)static局部變數
setjmp和longjmp是非局部性跳躍陳述式:非局部指的是,這並不類似於普通C語言的goto語句,語句在一個函數內進行跳轉,而是在棧上進行跳轉,可能跳過很多調用幀,然後返回到當前函數調用路徑上的某個函數中去。 使用setjmp和longjmp需要注意的地方: 1)setjmp和longjmp結合使用,有其相應的調用順序,setjmp在前,longjmp在後,以便可以恢複到先前被儲存的“程式執行點”;如果將其順序顛倒將使得程式的執行變得無法預測,非常容易使得程式崩潰退出;
參考:《one-day-one-leetcode》 問題描述: 注意理解程式中容器裝水取決於容器的小的那邊,並不是容器的大的那邊。 最佳化實現代碼: #include <iostream>#include <string>#include <vector>using namespace std;int maxArea(vector<int> height){ int i = 0; int j =
條款22:將成員變數聲明為private C++中我們需要將成員變數聲明為private,我們指導存取權限有public、private和protected,為什麼我們要選擇使用成員變數聲明為private呢。 如果使用public的話,任何外部函數或者外部類都可以訪問它,使得整個類體系變得超級脆弱,外部的變化超容易對體系造成致命的攻擊,所以許多成員變數應該被隱藏起來,通過public函數介面訪問。
參考:《one-day-one-leetcode》 要求:將整形數字轉化為羅馬數字,我們都知道羅馬數字有7個,分別為I(1),V(5),X(10),L(50),C(100),D(500),M(1000),這有個弊端,就是我們需要限制我們的輸入在1~3999內,因為大於3999或者小於1無法使用羅馬數字表示。 代碼實現: 1)_simple我們列舉了所有可能出現的情況,然後進行相應的匹配,代碼邏輯簡單; 2)第二種我們按照分類情況進行討論,邏輯上比較簡單,但是代碼實現比較冗餘。 #
【 聲明:著作權,轉載請標明出處,請勿用於商業用途。 聯絡信箱:libin493073668@sina.com】 10.1 概述 1.大多數演算法都定義在標頭檔algorithm中。標準庫還在檔案numeric中定義了一組數值泛型演算法。 10.2 初識泛型演算法 1. accumulate:定義在標頭檔numeric中。作用是對範圍求和。
在這篇部落格中,我們利用C++編寫了一個構建大頂堆的演算法,其中,在刪除堆元素之後的調整規為自上而下,而建立堆的時候調整演算法為自下而上調整。 我們構建的大頂堆結構為: 刪除掉堆頂元素之後堆的結構為: #include <iostream>#include <string>using namespace std;void swap(int& i, int& j){ int temp; temp = i; i = j;
條款50:瞭解new和delete的合理替換時機 為什麼我們還想要替換掉編譯器提供的operator new或者operator delete呢。下面給出三個常見理由: 1)用來檢測運用上的錯誤:如果將“new所得記憶體”delete掉卻不幸失敗,會導致記憶體流失;如果在“new所得記憶體”上面多次進行delete便會導致不確定的行為;如果operator new持有一系列動態分配所得地址,operator delete可以將其從地址中移除,很容易檢測上述錯誤用法;
用函數access,標頭檔是io.h,原型: int access(const char *filename, int amode); amode參數為0時表示檢查檔案的存在性,如果檔案存在,返回0,不存在,返回-1。 這個函數還可以檢查其它檔案屬性: 06
條款19:設計class猶如設計type 今天我們主要討論一下類的設計所面臨的問題進行著手,主要解決一些思路上的問題和誤區。 C++就像在其他OOP語言一樣,當你定義一個新的class,那麼也就定義了一個新的type。這意味這你的任務很重,不僅是class設計者,還是type設計者,重載函數,操作符,控制記憶體的分配和歸還、定義對象的初始化和終結,全都在你手上,因此我們需要從類(class)的設計所面臨的問題進行討論:
結構體類型變數的定義與其它類型的變數的定義是一樣的,但由於結構體類型需要針對問題事先自行定義,所以結構體類型變數的定義形式就增加了靈活性,共計有三種形式,分別介紹如下: 1) 先定義結構體類型,再定義結構體類型變數: struct stu / *定義學生結構體類型* / { char name[20]; / * 學生姓名* / char sex; / * 性別* /
現在,有問題如下: 問題參考牛客網《leetcode》部分,即針對二叉樹求解其和為定值的所有路徑,我們的解決思路為遞迴的進行求解,若該路徑和為給定的定值,則將其加入,否則,繼續求解。 實現代碼如下: 代碼1: class Solution {public: vector<vector<int> > pathSum(TreeNode *root, int sum) { vector<int> v; vector&
條款27:盡量少做轉型動作 C++的設計目標之一就是保證“類型錯誤”絕不可能發生,與此目標直接衝撞的是轉型操作,不論是C++中繼承C部分的轉型操作還是C++中所特有的4種類型轉換操作,這4中類型轉換操作可以參看上篇部落格補充(8)進行學習,都或多或少與這個目標有些抵觸,因此我們需要儘可能地去滿足這個目標。 C語言中轉型的形式可能如: (T)expression或者T(expression),其中後者常用於帶有explicit建構函式的類參數,稱為“舊式類型”;
條款52:寫了placement new也要寫palcement delete 問題: Widget* pw=new Widget; 這條語句的執行導致兩個函數被使用:一個是用以分配記憶體的operator new,另一個是Widget的default建構函式。假設其中第一個函數調用成功,第二個函數拋出異常。這樣第一步中operator
在c++中new有三種用法:執行個體化一個對象;執行個體化一個數組;定位new運算式。那麼今天我來說下第三種用法。 【什麼是定位new運算式】: 就是在記憶體中new一塊地址,然後將大小合適的執行個體化對象放入該地址中的操作方法 【什麼性質:】 就是在已申請的記憶體空間中調用建構函式 【怎麼使用定位new運算式】: 1)格式:new (place_address)
轉載:http://www.cnblogs.com/jerry19880126/p/3616999.html 工欲善其事,必先利其器,我們先用好Visual Studio工具,像下面這樣一步一步來: 先選擇左側的C/C++->命令列,然後在其他選項這裡寫上/d1 reportAllClassLayout,它可以看到所有相關類的記憶體布局,如果寫上/d1