STL之容器小结
一、理論提高:所有容器提供的都是值(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。
五、與大小相關的操作方法(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容器,最壞的情況下可能要遍歷完整個容器才能找到該用戶。
總結
- 上一篇: 20220129---CTF刷题---W
- 下一篇: CTF刷题网站汇总(包括本地可以自己搭建