//list的使用 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<list> using namespace std; /* 引用頭文件 #include<list> list類本身是一個類模板 list鏈表中的迭代器list類模板的一個內部類 這個類實現了鏈表元素指針的功能 是一個線性鏈表結構,它的數據由若干個節點構成,每一個節點都包括一個 信息塊(即實際存儲的數據)、一個前驅指針和一個后驅指針。它無需分配指定 的內存大小且可以任意伸縮,這是因為它存儲在非連續的內存空間中,並且由指5 針將有序的元素鏈接起來。 由於其結構的原因,list 隨機檢索的性能非常的不好,因為它不像vector 那 樣直接找到元素的地址,而是要從頭一個一個的順序查找,這樣目標元素越靠后, 它的檢索時間就越長。檢索時間與目標元素的位置成正比。 雖然隨機檢索的速度不夠快,但是它可以迅速地在任何節點進行插入和刪除 操作。因為list 的每個節點保存着它在鏈表中的位置,插入或刪除一個元素僅對 最多三個元素有所影響,不像vector 會對操作點之后的所有元素的存儲地址都有 所影響,這一點是vector 不可比擬的。 list 的特點: (1) 不使用連續的內存空間這樣可以隨意地進行動態操作; (2) 可以在內部任何位置快速地插入或刪除,當然也可以在兩端進行push和pop 。 (3) 不能進行內部的隨機訪問,即不支持[ ] 操作符和vector.at() ; Lists將元素按順序儲存在鏈表中,與向量(vectors)相比,它允許快速的插入 和刪除,但是隨機訪問卻比較慢. */ class Student{ public: int age; char name[30]; }; void Print(){ } void ProtectA(){ Student s1, s2, s3; s1.age = 12; strcpy(s1.name, "小米"); s2.age = 14; strcpy(s2.name, "小紅"); s3.age = 16; strcpy(s3.name, "小剛"); list<Student *> ldata; //從后面添加一個元素 ldata.push_back(&s1); ldata.push_back(&s2); ldata.push_back(&s3); //定義迭代器 //list<Student *>::iterator current = NULL; //報錯 :error C2440: “初始化”: 無法從“int”轉換為“std::_List_iterator<std::_List_val<std::_List_simple_types<Student *>>>” //說明 list<Student *>::iterator本質上是list<Student *>類的一個內部類 //這個內部類重載了=運算符 構造函數可以接受一個指針 /* begin()方法返回的是鏈表頭元素的迭代器 */ list<Student *>::iterator current = ldata.begin(); //強調current是個內部類 不是指針 但是迭代器的功能相當於鏈表元素的指針 //迭代器步長是一個元素類型大小的字節 for (current; current != ldata.end(); current++) { Student *temp = *current; //迭代器這個內部類重載了*運算符 cout << "學生姓名:" << temp->name << ";學生年齡是:" << temp->age << endl; } } void ProtectB(){ Student s1, s2, s3; s1.age = 12; strcpy(s1.name, "小米"); s2.age = 14; strcpy(s2.name, "小紅"); s3.age = 16; strcpy(s3.name, "小剛"); list<Student> ldata; ldata.push_back(s1); ldata.push_back(s2); ldata.push_back(s3); list<Student>::iterator current = ldata.begin(); for (current; current != ldata.end(); current++) { //Student *temp = current; //報錯 : 2 IntelliSense: 不存在從 "std::_List_iterator<std::_List_val<std::_List_simple_types<Student>>>" 到 "Student *" 的適當轉換函數 g:\test\SolutionC3\C001\tec01.cpp //簡單來說沒有實現=操作符重載 所以無法賦值 //2個操作數 左操作數類型是 Student * 用戶沒寫 c++編譯無法編譯通過 cout << "學生姓名:" << current->name << ";學生年齡是:" << current->age << endl; //迭代器內部類重載了->操作符 } } void main(){ ProtectA(); system("pause"); }