int arr[10][10]; memset(arr,0,10*10*sizeof(int)); //初始化 int tmp[10][10]; memcpy(arr, tmp, 10 * 10 * sizeof(int));//拷貝
void *memcpy(void *destin, void *source, unsigned n); //源*目的內存覆蓋問題c++
memcpy 函數用於 把資源內存(src所指向的內存區域) 拷貝到目標內存(dest所指向的內存區域);拷貝多少個?有一個size變量控制拷貝的字節數;數組
array<T,N> (數組容器) :基於數組,長度固定的序列,有 N 個 T 類型的對象。數據結構
vector<T> (向量容器) :基於數組,長度可變的序列,用來存放T類型的對象,預留分配大一些的一段連續空間,當超出時會二次分配更大的拷貝過去。函數
deque<T> (雙端隊列容器) :長度可變序列,用來存放T類型的對象,在序列的兩端都能高效地增長或刪除元素,由一段一段的定量連續空間構成,下標訪問必須進行二次指針解引用,與之相比 vector 的下標訪問只進行一次,只保有一個元素的 deque 必須分配其整個內部數組(例如 64 位 libstdc++ 上爲對象大小 8 倍; 64 位 libc++ 上爲對象大小 16 倍或 4096 字節的較大者)。優化
list<T> (鏈表容器) :長度可變的、由 T 類型對象組成的序列,它以雙向鏈表的形式組織元素,在這個序列的任何地方均可以高效地增長或刪除元素。訪問容器中任意元素的速度要比前三種容器慢,這是由於 list<T> 必須從第一個元素或最後一個元素開始訪問,須要沿着鏈表移動,直到到達想要的元素。ui
forward list<T> (正向鏈表容器) :長度可變的、由 T 類型對象組成的序列,它以單鏈表的形式組織元素,是一類比鏈表容器快、更節省內存的容器,可是它內部的元素只能從第一個元素開始訪問。spa
string:與vector類似的容器,但專門用於保存字符。隨機訪問快。在尾部插入/刪除速度快。.net
全部序列容器的函數成員 max_size() 都會返回它能存儲的元素個數的最大值。這一般是一個很大的值,通常是 2^32 -1。指針
The standard container classes vector, deque and list fulfill these requirements. By default, if no container class is specified for a particular stack class instantiation, the standard container deque is used. code
默認使用deque
而不是vector
做爲底層容器
map<string,vector<int> > empty_map1; map1.swap(empty_map1); map1.clear(); 或 StrategyMap().swap(_stg_flows);
map.clear()只是把map清空了,可是內存沒有釋放,若是要釋放內存不止是要clear()掉,還要和一個空的map來進行swap,將內存釋放。
注意map中若是元素不是基本類型,也要進行內存釋放,如指針,vector要尤爲注意,不然map佔的內存太大,會形成程序崩潰。
size表示vector中已有元素的個數,capacity表示vector最多可存儲的元素的個數;
爲了下降二次分配時的成本,vector實際配置的大小可能比客戶需求的更大一些,以備未來擴充,這就是容量的概念。即capacity>=size,
reserve(Count) 函數主要是預留Count大小的空間,對應的是容器的容量.
resize(Count) 函數主要是用於改變size的,也就是改變vector的大小,最終改變的是(_Mylast - _Myfirst)的值,當size < Count時,就插入元素,當size >Count時,就擦除元素。
array: 固定長度的數組,使用棧(靜態內存分配),所以效率與數組相同。
使用fill方法實現了數據填充。
使用size方法取得數組的大小。
雖然at(i)方法實現帶有越界檢查的讀寫。
寫入速度的比較結果:內置數組的速度最快,vector容器次之,array容器最慢???
拷貝速度:http://www.javashuo.com/article/p-rcpabios-gr.html
拷貝:/* 未開優化: array=466ms vector=7923ms memcpy=198ms */ /* -O3優化,最高速度: array=0ms vector=453ms memcpy=0ms */
在STL中,使用迭代器(內置類型 iterator)給出數據在表中的位置
containerType::iterator itr
;containerType::const_iterator itr
;containerType::reverse_iterator itr
;containerType::const_reverse_iterator itr
;經常使用的須要使用迭代器的容器方法:
iterator insert(iterator pos, const Object & x)
:添加x到表中迭代器pos所指向的位置以前的位置。對1ist是常量時間操做,對vector則不是。返回值是一個指向插入項位置的迭代器iterator erase(iterator pos)
:刪除迭代器所給出位置的對象。對1ist是常量時間操做,對vector不是。返回值是調用以前pos所指向元素的下一個元素的位置。這個操做使pos失效。pos再也不有用,由於它所指向的容器變量已經被刪除了iterator erase(iterator start, iterator end)
:刪除全部的從位置start開始直到位置end(可是不包括end)的全部元素