STL(Standard Template Library)標準模板庫大致上分爲六大組件,分別爲容器,算法,迭代器,仿函數,適配器和空間配置器,其中最重要的是容器,算法和迭代器,容器和算法之間經過迭代器無縫鏈接。算法
容器:各類數據結構,好比vector,list,deque,set,map等,用來存放數據;數組
算法:各類經常使用的算法,好比sort,find,copy,for_each等;數據結構
迭代器:提供一種方法,可以依序尋訪某個容器所含的各個元素,每一個容器都有本身專屬的迭代器。迭代器的使用很是相似於指針,能夠將迭代器做爲指針來理解。函數
vector<T> v; // T表明模板,能夠是任意的數據類型好比int,char,string等 vector<T> Name(v.begin(), v.end()); // 將[v.begin(), v.end)之間的元素賦值建立的Name容器 vector<T> Name(n, elem); // 將Name初始化爲包含10個elem值的容器 vector<T> Name(v); // 拷貝構造函數,將容器v賦值給容器Name
/***********************增長元素****************************/ push_back(elem); // vector尾部插入元素elem insert(const_iterator, elem); // 在迭代器指向的位置插入元素elem /***********************刪除元素****************************/ pop_vack(); // 刪除vector最後一個元素 erase(const_iterator); // 刪除迭代器指向位置的元素 erase(const_iterator start, const_iterator_end); // 刪除迭代器start和end之間全部的元素 clear(); // 刪除vector之間的全部元素 /***********************訪問元素****************************/ for(vector<int>::iterator it=v.begin(); it!=v.end(); it++) //it是vector<int>的迭代器,能夠理解爲指向容器內元素的指針 for(auto it=v.begin(); it!=v.end(); it++) // 經過auto自動推理出it的類型 for(auto sub_v : v) // 加強型for循環,直接經過底層的迭代器訪問容器內元素 for(int i=0; i<v.size(); i++) // 普通for循環,i表示元素的下標,能夠與數組同樣經過"v[i]"來訪問,或者"v.at(int i)"
vector數據結構相似於數組,可是與普通數組不一樣的是:vector容器能夠動態擴展,可是vector並非在原空間以後續接新的空間,而是尋找更大的內存空間而後將元數據拷貝到新的空間,以後再釋放原空間。指針
可是每次vector擴展空間以後都會多預留一部分空間,當新增的元素個數不超過預留的空間時,即可以直接續接在原vector後面。code
vector中使用size()函數來計算容器內元素的個數,而capacity()函數則返回容器的容量。元素個數至關於vector內實際存儲的數據個數,而容器的容量則表明容器開闢的內存空間個數,所以容量>=元素個數。內存
下面咱們來經過一段代碼來理解一下上述的內容:ci
vector<int>test; int* p = nullptr; int count=0; for(int i=0; i<10; i++){ test.push_back(i); // 經過push_back的方式存入數據,理論上每push_back一次,vector便複製一次 if(p != &test[0]){ // 若是容器進行了複製,那麼首地址必然會變,記錄下首地址的變化次數,便獲得複製次數 p = &test[0]; count++; } } cout << "vector 複製的次數:" << count << endl; // 輸出複製次數 cout << "vector 的容量:" << test.capacity() << endl; // 輸出vector的容量 cout << "vector 的元素個數:" << test.size() << endl; // 輸出vector的元素個數 /************************輸出結果***********************/ vector 複製的次數:7 // 能夠看出vector只複製了7次,能夠判斷每次vector在複製時預留了空間 vector 的容量:13 // 此時,vector中有13個位置,比元素個數多3個,即爲預留的空間 vector 的元素個數:10 // 正兒八經的元素個數