Time of Update: 2018-12-03
Bentley在他的著作《Writing Correct Programs》中寫道,90%的電腦專家不能在2小時內寫出完全正確的二分搜尋演算法。難怪有人說,二分尋找原理簡單,甚至小學生都能明白。不過這尋找演算法好多專家都寫不好。我自己嘗試了一下,確實要第一次就完全寫正確不容易.以下兩份實現依次為迭代和遞迴版本的代碼,二分尋找的思想很多人都清楚,但是這裡有一個細節就是要注意邊界的選擇。//迭代方法int search(int array[], int n, int v){ int left,
Time of Update: 2018-12-03
原文:http://www.altdevblogaday.com/2012/04/26/functional-programming-in-c/作者:John Carmack-潘宏 譯-2013年1月-email:
Time of Update: 2018-12-03
原文:http://www.altdevblogaday.com/2012/04/26/functional-programming-in-c/作者:John Carmack-潘宏 譯-2013年1月-email: popyy@netease.com-weibo.com/panhong101並非所有程式都是純正的,除非該程式只和自身代碼打交道,而程式多數情況下也需要和外界互動。雖然探險般地將純正做到極致是一種樂趣,但實際情況也表明:有時候,副作用也是必要的,應該好好管理這些副作用。在有些函數中,
Time of Update: 2018-12-03
原文:http://www.altdevblogaday.com/2012/04/26/functional-programming-in-c/作者:John Carmack-潘宏 譯-2013年1月-email: popyy@netease.com-weibo.com/panhong101Michael
Time of Update: 2018-12-03
自己寫的stack類,功能可能很少,也可能裡面很多錯誤,,但至少我測試的是正確的,;代碼奉上:#include <iostream>using namespace std;template <class T>class node{public:node<T>* next;T val;node():next(NULL),val(){};node(T v):next(NULL),val(v){};};template <class T>class
Time of Update: 2018-12-03
當把一個衍生類別對象賦給一個基類對象時,會發生對象切割。(另外用基類對象強制轉換衍生類別對象也會)對象切割會發生什麼呢?#include <iostream>using namespace std;class CShape{public:CShape (){m_color=0;}~CShape(){}virtual void draw(){cout<<"This is a
Time of Update: 2018-12-03
#include <iostream>class MyClass{public: MyClass(){std::cout << "Hello MyClass!" << std::endl;}public: void MyMethod(){std::cout << "Hello MyMethod!" << std::endl;}}; 如果這樣定義對象:MyClass obj;
Time of Update: 2018-12-03
1.不用局部變數和全域變數實現strlen庫函數 一般用有變數的實現方法是:(1)、不管效率的簡單的實現 size_t strlen_a(const char * str) { size_t length = 0 ; while (*str++ ) ++ length; return length;}也可以稍加改進下是:size_t strlen_b(const char * str) { const char *cp = str;
Time of Update: 2018-12-03
類對象的構造順序是這樣的:1.分配記憶體,調用建構函式時,隱式/顯示的初始化各資料成員 初始化階段可以是顯式的或隱式的,取決於是否存在成員初始化表。隱式初始化階段按照聲明的順序依次調用所有基類的預設建構函式,然後是所有成員類對象的預設建構函式。2.進入建構函式後在建構函式中執行一般計算 計算階段由建構函式體內的所有語句構成。在計算階段中,資料成員的設定被認為是賦值,而不是初始化。使用初始化列表有兩個原因:1.必須這樣做:
Time of Update: 2018-12-03
C的記憶體管理有1)變數管理。除了全域變數和靜態變數(那些定義在任何函數以外的變數,一般C語言中不出現,靜態變數是有static關鍵字的變數)是在堆棧中管理的,進入函數建立這些變數,退出函數就銷毀了。2)函數調用,這個也是在堆棧中。3)用庫函數動態分配的記憶體。C庫裡的函數實際上是調用DOS 功能,調用介面是int 21H,功能號放在AX裡。功能號我記不清了。具體參見相關技術指南。對於1)和2),舉個例子:fu(int j){ int i;}如果調用fu(2),那麼彙編代碼大概是push
Time of Update: 2018-12-03
綜合/巨著《C++程式設計語言(特別版)》Bjarne Stroustrup中文版:裘宗燕 譯機械工業出版社影印版:高等教育出版社 程式設計語言的書,有一個很有趣的現象,就是語言發明者幾乎都要寫書,而語言開發年代越新的,書的品質似乎越差。C和C++以及Perl的夫子自道均成 為不可動搖的經典,相比之下C的口碑最好,20年後仍然首屈一指;Java(人民郵電出版社即將出版)處於中點,雖然也堪稱經典,但是因為競爭激烈,不如
Time of Update: 2018-12-03
Library 4. Operators Operators庫如何改進你程式?Operators用法Operators 總結 Operators庫如何改進你的程式?提供一組完整的比較操作符提供一組完整的算術操作符提供一組完整的迭代器操作符C++定義的操作符可以分成幾組。當你在一個類中碰到某組操作符中的一個,通常你還會碰到同組中的其它操作符。例如,如果一個類提供了 operator==, 你通常還會看到 operator!= ,或許還有 operator<, operator<=,
Time of Update: 2018-12-03
一.如何將程式檔案切割應將原有程式合理切割為三部分1.標頭檔:包含結構生命和使用這些結構的函數的原型。標頭檔常包含的內容函數原型使用#define或const定義的符號常量結構聲明類聲明模板聲明內嵌函式#include name.h#include <name.h><>首先在儲存標準標頭檔的目錄尋找,不加的則在目前的目錄或原始碼目錄尋找運用#ifdef
Time of Update: 2018-12-03
Any 標頭檔: "boost/any.hpp"類 any 允許對任意類型進行型別安全的儲存和取回。不象無類類型,any 儲存了類型資訊,並且不會讓你在不知道正確類型的情況下獲得存入的值。當然,有辦法可以讓你詢問關於類型的資訊,也有測試儲存的值的方法,但最終,調用者必須知道在 any 對象中的值的真實類型,否則不能訪問any。可以把 any 看作為上鎖的安全性。沒有正確的鑰匙,你不能進入其中。any 對它所儲存的類型有以下要求:CopyConstructible
Time of Update: 2018-12-03
眾所周知,C++函數重載時傳回值是不參與重載決議的, 也就是說:int lex_cast(const char*);double lex_cast(const char*);這樣兩個函數在同一個編譯單元同一個 namespace 中時, 會編譯報錯.怎麼辦呢?一個小技巧:#include <iostream>#include <string>#include <boost/lexical_cast.hpp>class my_cast { const
Time of Update: 2018-12-03
C++ 中 lambda 可以直接傳遞給模板函數如 std::sort, 但無法傳給模板類如 std::map,但是,使用一點小技巧,可以使用 lambda 建立模板類的對象,省了很多麻煩的 coding。這裡給出一個樣本:#include <stdio.h>#include <map>template<class Key, class Value, class Compare>std::map<Key, Value, Compare> make_
Time of Update: 2018-12-03
目前已經全部完成,並且取得了非常好的效果 。使用該RPC的簡短代碼: rpc函數的傳回值是 rpc_ret_t,主要是為了避免專門為void傳回值的函數編寫特化代碼 //////////////////////////////////////////////////////////////////////////// sample usage...// test.h typedef std::vector<unsigned> vint_vec;class
Time of Update: 2018-12-03
EditPlus使用編輯Object C到官方網站下載http://www.editplus.com/javacpp.html安裝.stx和php.acp檔案。我的EditPlus安裝在C:\Program Files\EditPlus 3裡,那麼我就把下載下來的iphone.stx和iphone.acp檔案複製到C:\Program Files\EditPlus
Time of Update: 2018-12-03
C語言所有複雜的指標聲明,都是由各種聲明嵌套構成的。如何解讀複雜指標聲明呢?右左法則是一個既著名又常用的方法。不過,右左法則其實並不是C標準裡面的內容,它是從C標準的聲明規定中歸納出來的方法。C標準的聲明規則,是用來解決如何建立聲明的,而右左法則是用來解決如何辯識一個聲明的,兩者可以說是相反的。右左法則的英文原文是這樣說的: The right-left rule: Start reading the declaration from the
Time of Update: 2018-12-03
C++ 標準委員會真是太死板了,既然給 C++ 增加了 lambda,就真的按部就班地套用 lambda 的標準定義,也不加個 lambda的自引用機制。找了半天,除了那些學院派的足以把99%的人搞暈的 Fix Point + Y combinator,一個最實用的解決方案就是把 lambda bind 到 std::function<...>.我那段需要 recursive lambda 的代碼: void print_output() const { // use