#include <iostream>
#include<algorithm>
#include <string>
#include <list>
using namespace std;//3.6.4.1 list構造函數
//list<T> lstT;//list采用采用模板類實現,對象的默認構造形式:
//list(beg, end);//構造函數將[beg, end)區間中的元素拷貝給本身。
//list(n, elem);//構造函數將n個elem拷貝給本身。
//list(const list& lst);//拷貝構造函數。
//3.6.4.2 list數據元素插入和刪除操作
//push_back(elem);//在容器尾部加入一個元素
//pop_back();//刪除容器中最后一個元素
//push_front(elem);//在容器開頭插入一個元素
//pop_front();//從容器開頭移除第一個元素
//insert(pos, elem);//在pos位置插elem元素的拷貝,返回新數據的位置。
//insert(pos, n, elem);//在pos位置插入n個elem數據,無返回值。
//insert(pos, beg, end);//在pos位置插入[beg,end)區間的數據,無返回值。
//clear();//移除容器的所有數據
//erase(beg, end);//刪除[beg,end)區間的數據,返回下一個數據的位置。
//erase(pos);//刪除pos位置的數據,返回下一個數據的位置。
//remove(elem);//刪除容器中所有與elem值匹配的元素。
//
//
//3.6.4.3 list大小操作
//size();//返回容器中元素的個數
//empty();//判斷容器是否為空
//resize(num);//重新指定容器的長度為num,
//若容器變長,則以默認值填充新位置。
//如果容器變短,則末尾超出容器長度的元素被刪除。
//resize(num, elem);//重新指定容器的長度為num,
//若容器變長,則以elem值填充新位置。
//如果容器變短,則末尾超出容器長度的元素被刪除。
//
//3.6.4.4 list賦值操作
//assign(beg, end);//將[beg, end)區間中的數據拷貝賦值給本身。
//assign(n, elem);//將n個elem拷貝賦值給本身。
//list& operator=(const list& lst);//重載等號操作符
//swap(lst);//將lst與本身的元素互換。
//3.6.4.5 list數據的存取
//front();//返回第一個元素。
//back();//返回最后一個元素。
//3.6.4.6 list反轉排序
//reverse();//反轉鏈表,比如lst包含1,3,5元素,運行此方法后,lst就包含5,3,1元素。
//sort(); //list排序//打印數據
void printInt(list<int>& l) {for (list<int>::iterator it = l.begin(); it != l.end(); ++it) {cout << *it << endl;}
}void test1() {list<int> l;for (int i = 0; i < 5; i++) {l.push_back(i);}list<int> l2(10, 88);list<int> l3(l2.begin(), l2.end());printInt(l2);printInt(l3);l2.push_back(100);//逆序打印for (list<int>::reverse_iterator it = l2.rbegin(); it != l2.rend(); ++it) {cout << *it << endl;}// list容器不支持隨機訪問迭代器list<int>::iterator it_1 = l.begin();//it_1 = it_1 + 1; // 插入數據 尾插 頭插list<int> l1;l1.push_back(23);l1.push_front(233);//刪除兩端數據 尾刪 頭刪l1.pop_back();l1.pop_front();// insert 插入數據l1.insert(l1.begin(), 1000);//remove 刪除數據l1.remove(1000);// list大小cout << l1.size() << endl;}bool intPare(int a, int b) {return a > b;
}void test2() {list<int> l4;l4.assign(5, 2);//printInt(l4);list<int> l5;l5.push_back(234);l5.push_back(89);l5.assign(l4.begin(), l4.end()); // 這樣l5之前的數據就沒有了printInt(l5);l5.push_front(563);// 不支持隨機訪問迭代器的容器, 都不能用系統排序sort// X sort(l5.begin(), l5.end());l5.sort();// 默認升序printInt(l5);l5.sort(intPare); // 自定義排序printInt(l5); l5.reverse();// 反轉
}//list 操作自定義類型
class Person {
public:Person(string name, int age, int height) {this->m_name = name;this->m_age = age;this->m_height = height;}bool operator== (const Person &p) {return this->m_age == p.m_age && this->m_height == p.m_height && this->m_name == p.m_name;}string m_name;int m_age;int m_height;
};// 年齡降序, 年齡一樣的話, 按照身高升序來
bool personParse(Person &p1, Person &p2) {if (p1.m_age == p2.m_age) {return p1.m_height < p2.m_height;}return p1.m_age > p2.m_age;
}
void printPerson(const list<Person> &l) {for (list<Person>::const_iterator it = l.begin(); it != l.end(); ++it) {cout << (*it).m_name << "age is" << (*it).m_age << "height is" << (*it).m_height << endl;}
}
void test3() {list<Person> l;Person p1("A", 50, 172);Person p2("B", 23, 182);Person p3("C", 78, 178);Person p4("D", 29, 183);Person p5("E", 29, 180);l.push_back(p1);l.push_back(p2);l.push_back(p3);l.push_back(p4);l.push_back(p5);//l.sort(); 對于自定義數據類型,需要自定義排序規則l.sort(personParse);printPerson(l);// list 容器刪除自定義類型數據Person p6("E", 29, 180);l.remove(p6); //??? 這里不知道為什么報錯,// 二進制“==”: 沒有找到接受“const _Ty”類型的左操作數的運算符(或沒有可接受的轉換printPerson(l);
}
int main()
{//test1();//test2();test3();return 0;
}
list是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。
ist容器不僅是一個雙向鏈表,而且還是一個循環的雙向鏈表。
list所支持迭代器為雙向迭代器
不支持系統的sort排序, list有自己的sort成員函數
疑惑:??? list在刪除自定義數據類型是報錯
二進制“==”: 沒有找到接受“const _Ty”類型的左操作數的運算符(或沒有可接受的轉換)
這里先記錄下, 后期明白了, 再來解決。