Time of Update: 2017-02-27
C++, 會預設產生一個複製建構函式, 當類中出現指標時, 複製會執行淺拷貝, 即只複製指標的地址, 不會複製資料;所以在類中, 使用指標時, 需要注意; 如果想使用深拷貝, 可以添加複製建構函式.以下代碼, 如果不添加複製建構函式, 則會運行出錯, 但可以通過編譯,運行時, 因為刪除(delete[])兩次str所指的同一片地址空間, 所以程式無法執行.代碼:/* * main.cpp * * Created on: 2014.4.15 * Author: Spike *
Time of Update: 2017-02-27
容器(container)的erase()函數, 是刪除一個元素, 會移動迭代器的指標, 指向下一個元素;迭代器(iterator)是一種指標, 賦值是傳遞的地址, 指向相同的元素;代碼:/* * test.cpp * * Created on: 2014.04.18 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #include
Time of Update: 2017-02-27
The scoped_array class template stores a pointer to a dynamically allocated array.scoped_array類模板儲存了一個指向動態分配數組的指標, 可以自動析構堆(heap)上所使用的記憶體.標頭檔: #include <boost/scoped_array.hpp>代碼:/* * test.cpp * * Created on: 2014.04.18 * Author:
Time of Update: 2017-02-27
快速排序基本特性時間複雜度:O(n*lgn)最壞:O(n^2)空間複雜度:最好情況下:O(lgn),最壞情況:O(n),平均情況:O(lgn)不穩定。關於快速排序的空間複雜度,謝謝@命運他爹 同學指正。詳述一下。快速排序由於每次遞迴的時候會佔用一個空間返回中間數位置,所以一次遞迴的空間複雜度為O(1)。最好情況和最壞情況下的遞迴深度為O(lgn),相應的空間複雜度就是O(lgn)最壞情況下的遞迴深度為O(n),空間複雜度為O(n)。演算法QUICKSORT(A, p, r) if p
Time of Update: 2017-02-27
數組容器, 是儲存數組的容器, 是C類型數組的擴充, 可以使用迭代器進行操作;例如"std::array<int, 5>", 需要注意的是, 如果直接進行賦值, "std::array<int, 5> ia = {1, 2, 3, 4, 5}; "在GCC下會有警告: "missing braces around initializer for 'std::array<int, 5u>::value_type
Time of Update: 2017-02-27
對於預先處理的單純常量, 可以使用const類型進行代替;在物件導向編程中, 類內的常量, 可以使用靜態const成員代替,注意類內(in-class), 靜態const成員只允許使用整型常量進行賦值, 如果是其他類型, 是在類內聲明, 類外定義的方式;也可以使用"enum hack", 提供const的作用, 並且給內建(built-in)數組聲明;預先處理的函數調用存在很多問題, 可以使用模板內聯(template inline)代替,
Time of Update: 2017-02-27
迭代器(iterator) 是一種指標類型, 也分const指標本身(地址) 和 const指標所指的值, 兩種情況;但是寫法和const內建指標有所不同;char * const 相當於 const container<>::iterator; 可以修改指標所指的值, 但不能修改指標的地址;const char * 相當於 container<>::const_iterator; 可以修改指標地址, 但不能修改指標所指的值;注意程式碼範例,
Time of Update: 2017-02-27
指標(*)和引用(&),解引用(*)和取地址(&), 主要觀察是在左面, 還是在右面, 如果在左面是前者, 在右面是後者;如果比較多, 則要認真觀察, 譬如int*&, 就是指標的引用, 可以避免指標內部元素的複製;還有其他的一些形式, 見下面的例子;代碼:/* * test.cpp * * Created on: 2013.11.12 * Author: Caroline */ /*eclipse cdt; gcc 4.7.1*/
Time of Update: 2017-02-27
函數模板在調用函數的時候, 由於實參(argument)轉換形參(parameter)的時候, 會發生改變, 導致無法保留原實參的資訊, 即推進(forward)問題;主要包括: 引用和右值;引用, 即因為模板參數非引用, 導致複製操作, 無法提供參考型別;右值, 即因為模板參數只能轉換為左值, 無法提供右值;解決方案:引用: 使用右值參數(T&& t), 可以保證傳遞引用不發生改變;右值:使用右值參數,
Time of Update: 2017-02-27
函數模板(function template)重載, 即執行個體化特定的模板, 確定T的類型, 選擇匹配度最高的一個;需要注意傳遞的具體類型, 如傳遞的是"&s", 則表示"string* t = &s", 即實際匹配的類型為"string* t";當非函數模板和函數模板匹配度相同時, 優先選擇非函數模板;調用模板時, 一定要注意順序, 或者提前聲明, 以保證可以找到函數模板, 進行執行個體化;具體參見代碼注釋,
Time of Update: 2017-02-27
非類型模板參數(nontype template parameters), 可以使用整數型別(integral type),指標(pointer) 或者是 引用(reference);綁定非類型整數形參(nontype integral parameter) 的 實參(argument) 必須是常量運算式(constant expression, constexpr);不能把普通的局部對象或者動態對象 綁定 指標或引用的非類型形參, 可以使用全域類型進行綁定;關於類模板(class
Time of Update: 2017-02-27
子運算式(subexpressions)的 資料驗證(data validation), 可以通過括弧"()"分解Regex的子運算式;然後使用下標標示符[], 輸出相應的子運算式, "0"代表全體, "1"代表第一個括弧, 依次遞加;通過對於問號項?是否匹配, 驗證Regex的匹配式;代碼:#include <iostream> #include <string> #include
Time of Update: 2017-02-27
Regex, 可以替換(replace)匹配的字串, 使用regex_replace()函數, 需要指定替換的格式;也可以提供參數, 進行特定的輸出, 替換格式的命名空間: "boost::regex_constants::"編程環境: gcc 4.8.1 + eclipse cdt + c++11 + boost代碼:#include <iostream> #include <string> #include
Time of Update: 2017-02-27
在多重繼承中, 如果多個基類包含相同名字的成員函數, 則在衍生類別使用時, 容易發生歧義, 會導致出錯;解決方案是: 在衍生類別中重寫基類方法, 覆蓋原方法, 再指定基類範圍(scope), 確定使用那個基類的方法, 可以避免歧義;代碼如下:/* * cppprimer.cpp * * Created on: 2014.1.10 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include
Time of Update: 2017-02-27
虛繼承主要是避免基類重複被繼承, 包含多個相同基類, 導致歧義性, 使用虛基類(virtual base class)繼承, 可以使派生對象只包含一份基類檔案.如果不使用虛繼承, 則衍生類別需要提供一份自己的樣本版本,參見: http://blog.csdn.net/caroline_wendy/article/details/18077235代碼:/* * cppprimer.cpp * * Created on: 2014.1.10 * Author: Spike */
Time of Update: 2017-02-27
題目: 關於C++中, 四種類型轉換的關鍵字, 的詳解, 也可以給出代碼, 判斷輸出 或 判斷哪些代碼有誤.答案及範例如下:四種關鍵字: const_cast, 常量性轉除;dynamic_cast, 向下安全轉型; reinterpret_cast, 重新解釋轉型; static_cast, 靜態轉型;1. const_cast, 常量性轉除:主要對變數的常量性(const)進行操作, 移除變數的常量性, 即可以被非常量指向和引用, 詳見代碼;2. dynamic_cast,
Time of Update: 2017-02-27
常態分佈(norm distribution), 做為一種重要的分布規律, 有廣泛的用途;注意常態分佈包含兩個參數, 均值(mean) 和標準差(standard deviation);隨機庫(#include <random>), 包含常態分佈對象, norm_distribution<>, 可以用於產生常態分佈;代碼如下:#include <iostream> #include <vector> #include
Time of Update: 2017-02-27
伯努利分布(bernoulli distribution), 是判斷某件事情發生或者未發生的機率;給定參數p, 可以修改機率的值, 發生機率(true)是p,未發生機率(false)是1-p;隨機庫, 提供分布對象bernoulli_distribution, 輸出bool值, 發生為true, 未發生為false;伯努利分布, 機率為0.5時, 可以等機率輸出一個二元事件, 如先後順序;注意: 引擎和分布對象, 聲明在函數外, 則每次調用, 都會產生不同的值, 但卻是固定的,
Time of Update: 2017-02-27
讀取文本的每行("\n"), 儲存入數組vector<string>, 輸出時, 少輸出最後一行, 即可.代碼:/* * main.cpp * * Created on: 2014.06.08 * Author: Spike */ /*vs 2012*/ #include <windows.h> #include <fstream> #include <iostream>
Time of Update: 2017-02-27
雙向鏈表的基本運算:1、尋找假若我們要在一個帶表頭的雙向迴圈鏈表中尋找資料域為一特定值的某個結點時,我們同樣從表頭結點往後依次比較各結點資料域的值,若正是該特定值,則返回指向結點的指標,否則繼續往後查,直到表尾。下例就是應用雙向迴圈鏈表尋找演算法的一個程式。#include <stdio.h>#include <malloc.h>#define N 10typedef struct node{char name[20];struct node *llink,*rlink;