一、理論提高:所有容器提供的都是值(value)語意,而非引用(reference)語意。容器執行插入元素的操作時,內部實施拷貝動作。所以STL容器內存儲的元素必須能夠被拷貝(必須提供拷貝構造函數)。
#define _CRT_SECURE_NO_WARNINGS#include <iostream>
using namespace std;
#include "vector"class Teacher
{
public:Teacher(char *name, int age){m_pname = new char[strlen(name) + 1];strcpy(m_pname, name);m_age = age;}~Teacher(){if (m_pname != NULL){delete[] m_pname;m_pname = NULL;m_age = 0;}}//Teacher t2 = t1;Teacher(const Teacher &obj){m_pname = new char[strlen(obj.m_pname)+1];strcpy(m_pname, obj.m_pname);m_age = obj.m_age;}//重載 =號操作符//t3 = t2 = t1Teacher& operator=(const Teacher &obj){//先把t2的舊的內存釋放掉if (m_pname != NULL){delete[] m_pname;m_pname = NULL;m_age = 0;}//根據t1的大小分配內存 m_pname = new char[strlen(obj.m_pname) +1 ];//copy t1的數據strcpy(m_pname, obj.m_pname);m_age = obj.m_age;return *this;}public:void printT(){cout << m_pname << "\t" << m_age << endl;}
protected:
private:char *m_pname;int m_age;
};void main1301()
{Teacher t1("t1", 31);t1.printT();vector<Teacher> v1;v1.push_back(t1); //把t1拷貝了一份 存入到容器中了....}
void main()
{main1301();cout<<"hello..."<<endl;system("pause");return ;
}
二、除了queue與stack外,每個容器都提供可返回迭代器的函數,運用返回的迭代器就可以訪問元素。
三、通常STL不會丟出異常。要求使用者確保傳入正確的參數。
四、每個容器都提供了一個默認構造函數跟一個默認拷貝構造函數。
如已有容器vecIntA。
vector<int> vecIntB(vecIntA); //調用拷貝構造函數,復制vecIntA到vecIntB中。
五、與大小相關的操作方法(c代表容器):
c.size(); //返回容器中元素的個數
c.empty(); //判斷容器是否為空
六、比較操作(c1,c2代表容器):
c1 == c2 判斷c1是否等于c2
c1 != c2 判斷c1是否不等于c2
c1 = c2 把c2的所有元素指派給c1
七、deque的使用場景
比如排隊購票系統,對排隊者的存儲可以采用deque,支持頭端的快速移除,尾端的快速添加。如果采用vector,則頭端移除時,會移動大量的數據,速度慢。
vector與deque的比較:
(1) vector.at()比deque.at()效率高,比如vector.at(0)是固定的,deque的開始位置卻是不固定的。
(2) 如果有大量釋放操作的話,vector花的時間更少,這跟二者的內部實現有關。
(3) deque支持頭部的快速插入與快速移除,這是deque的優點。
八、list的使用場景
比如公交車乘客的存儲,隨時可能有乘客下車,支持頻繁的不確實位置元素的移除插入。
九、set的使用場景
比如對手機游戲的個人得分記錄的存儲,存儲要求從高分到低分的順序排列。
十、map的使用場景
比如按ID號存儲十萬個用戶,想要快速要通過ID查找對應的用戶。二叉樹的查找效率,這時就體現出來了。如果是vector容器,最壞的情況下可能要遍歷完整個容器才能找到該用戶。