目錄
一 list 常見構造
1 空容器構造函數(默認構造函數)
2 Fill 構造函數
3 Range 構造函數
4 拷貝構造函數
二 list迭代器
1 begin && end
2 rbegin && rend
三 list?容量操作
四 list?修改操作
1 assign?
2? push_front && pop_back
3 push_back && pop_back
4? insert
5 erase
6 swap
7. resize
8 clear
9 關于 emplace系列操作說明
五 list 元素訪問
六 其他操作
1?splice
2 remove
3 unique
4 sort
5? reverse?
七 總結?
一 list 常見構造
1 空容器構造函數(默認構造函數)
構造一個沒有元素的空容器。
2 Fill 構造函數
構造一個包含?n?個元素的容器。每個元素都是?val?的副本。
3 Range 構造函數
構造一個容器,其中包含與范圍?[first,last]?一樣多的元素,每個元素都按相同的順序從該范圍中的相應元素構造而成。
4 拷貝構造函數
構造一個容器,其中包含?x?中每個元素的副本,順序相同。
#include<iostream>
#include<list>
using namespace std;void Print(list<int>& lt)
{list<int>:: iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}cout << endl;
}int main()
{list<int> a;list<int> b(4, 100);list<int> c(4);list<int> d(b.begin(), b.end());list<int> e(b);cout << "b: ";Print(b);cout << "c: ";Print(c);cout << "d: ";Print(d);cout << "e: ";Print(e);return 0;
}
C++11構造
void Print(list<int>& lt)
{list<int>:: iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}cout << endl;
}int main()
{list<int> lt1{ 1, 2, 3, 4, 5 };Print(lt1);return 0;
}
?
二 list迭代器
list模式和vector如出一轍
注意:
ist的迭代器是支持++
和--
操作的(前后綴都支持)
但是不支持+
和-
操作,因為鏈表不能進行隨機訪問操作,只能O(n)
查詢
1 begin && end
iterator begin();const_iterator begin() const;
iterator end();const_iterator end() const;
void Test3()
{list<int> lt(4, 1);list<int>::iterator it = lt.begin();while (it != lt.end()){cout << *it << ' ';++it;}cout << endl;const list<int> llt(4, 10);list<int>::const_iterator itt = llt.begin();while (itt != llt.end()){cout << *itt << ' ';++itt;}}
2 rbegin && rend
reverse_iterator rbegin();const_reverse_iterator rbegin() const;
reverse_iterator rend();const_reverse_iterator rend() const;
void Test4()
{list<int> lt(5);list<int>::reverse_iterator it = lt.rbegin();int i = 1;while (it != lt.rend()){*it += i;++it;++i;}for (auto e : lt){cout << e << ' ';}}
三 list?容量操作
?這里直接代碼演示
void Test5()
{list<int> lt1;if (lt1.empty()) cout << "empty" << endl;else cout << "full" << endl;list<int> lt2{ 1, 2, 3, 4 };cout << "lt1: " << lt1.size() << " lt2: " << lt2.size() << endl;
}
四 list?修改操作
1 assign?
將新內容分配給 list?容器,替換其當前內容,并相應地修改其大小。
range (1)
template <class InputIterator> void assign (InputIterator first, InputIterator last);
fill (2)
void assign (size_type n, const value_type& val);
void Test6()
{std::list<int> first;std::list<int> second;first.assign(7, 100); second.assign(first.begin(), first.end()); int myints[] = {1776,7,4 };first.assign(myints, myints + 3); cout << "first: ";for (auto e : first){cout << e << " ";}cout << endl;cout << "second: ";for (auto e : second){cout << e << " ";}cout << endl;
}
?
2? push_front && pop_back
void push_front (const value_type& val);
void pop_front();
void Test7()
{list<int> lt = { 1, 2 };lt.push_front(100);for (auto e : lt){cout << e << " ";}cout << endl;lt.pop_front();for (auto e : lt){cout << e << " ";}cout << endl;
}
?
3 push_back && pop_back
void push_back (const value_type& val);
void pop_back();
void Test8()
{list<int> lt = { 1, 2 };lt.push_back(100);for (auto e : lt){cout << e << " ";}cout << endl;lt.pop_back();for (auto e : lt){cout << e << " ";}cout << endl;
}
4? insert
指定位置的元素之前插入新元素來擴展容器,從而有效地通過插入的元素數增加容器大小
single element (1)
iterator insert (iterator position, const value_type& val);fill (2) void insert (iterator position, size_type n, const value_type& val);range (3)
template <class InputIterator> void insert (iterator position, InputIterator first, InputIterator last);
void Test9()
{list<int> lt(4, 10);lt.insert(lt.begin(), 100);for (auto e : lt){cout << e << ' ';}cout << endl;lt.insert(lt.end(), 4, 100);for (auto e : lt){cout << e << ' ';}cout << endl;}
5 erase
從容器中刪除單個元素 (position) 或一系列元素 ( [first,last))
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
void Test10()
{list<int> lt{ 1, 2, 3, 4, 5, 6};lt.erase(lt.begin());for (auto e : lt){cout << e << ' ';}cout << endl;lt.erase(++lt.begin(), lt.end());for (auto e : lt){cout << e << ' ';}
}
6 swap
?通過 x 的內容交換容器的內容,x 是另一個相同類型的容器對象。size可能有所不同。
void swap (list& x);
void Test11()
{list<int> l1(4, 10);list<int> l2(4, 1);l1.swap(l2);cout << "l1: ";for (auto e : l1){cout << e << ' ';}cout << endl;cout << "l2: ";for (auto e : l2){cout << e << ' ';}
}
7. resize
調整容器的大小,使其包含 n 個元素。
void resize (size_type n);
void resize (size_type n, const value_type& val);
如果?n?小于當前容器大小,則內容將減少到其前?n?個元素,刪除超出(并銷毀它們)的元素。
如果?n?大于當前容器大小,則通過在末尾插入所需數量的元素來擴展內容,以達到?n?的大小。
如果指定了?val,則新元素將初始化為?val?的副本,否則,它們將進行值初始化(0)。
void Test12()
{list<int> mylist;for (int i = 1; i < 10; ++i) mylist.push_back(i);mylist.resize(5);cout << "mylist contains:";for (std::list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)std::cout << ' ' << *it;cout << endl;mylist.resize(8, 100);cout << "mylist contains:";for (std::list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)std::cout << ' ' << *it;cout << endl;mylist.resize(12);cout << "mylist contains:";for (std::list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)std::cout << ' ' << *it;cout << endl;}
8 clear
?從容器中刪除所有元素(這些元素被銷毀),使容器的大小為0。
void clear() noexcept;
void Test13()
{list<int> lt(1, 4);lt.clear();cout << lt.size() << endl;for (auto e : lt){cout << e << ' ';}cout << endl;
}
9 關于 emplace系列操作說明
這個系列的操作放在 右值引用講解完之后再講, 這樣才能更好的理解. 大家不需要著急的, 因為 上面講的完全夠用, 而且emplace 是優化, 并不是其他功能
五 list 元素訪問
?
void Test13()
{list<int> lt{ 1, 2, 3, 4 };cout << lt.front() << endl;cout << lt.back() << endl;
}
六 其他操作
1?splice
將元素從一個列表轉移到另一個列表
void splice(iterator position, list& x);
將?x?的所有元素轉移到容器中void splice(iterator position, list& x, iterator i);
僅將?i?指向的元素從?x?傳輸到容器中void splice(iterator position, list& x, iterator first, iterator last);
將范圍?[first,last)?從?x?傳輸到容器中。
void Test14()
{list<int> mylist1 = { 1, 2, 3, 4 }, mylist2 = { 10, 20, 30 };list<int>::iterator it = mylist1.begin();++it; // points to 2mylist1.splice(it, mylist2); // mylist1: 1 10 20 30 2 3 4cout << "mylist1: ";for (auto e : mylist1){cout << e << " ";}cout << endl;cout << "mylist2: ";for (auto e : mylist2){cout << e << " ";}cout << endl;mylist2.splice(mylist2.begin(), mylist1, mylist1.begin());cout << "mylist1: ";for (auto e : mylist1){cout << e << " ";}cout << endl;cout << "mylist2: ";for (auto e : mylist2){cout << e << " ";}cout << endl;mylist1.splice(mylist1.begin(), mylist2, mylist2.begin(), mylist2.end());cout << "mylist1: ";for (auto e : mylist1){cout << e << " ";}cout << endl;cout << "mylist2: ";for (auto e : mylist2){cout << e << " ";}cout << endl;
}
2 remove
從容器中刪除所有與?val相等的元素。這將調用這些對象的析構函數,并通過刪除的元素數來減小容器大小。
vvoid remove (const value_type& val);
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(2);lt.push_back(4);lt.push_back(5);cout << lt.size() << endl;lt.remove(2);for (auto e : lt){cout << e << " ";}cout << endl;cout << lt.size() << endl;return 0;
}
3 unique
從容器中每個連續的相等元素組中刪除除第一個元素之外的所有元素。請注意,只有當某個元素與其前面的元素相等時,該元素才會從列表容器中刪除。因此,此函數對于排序列表特別有用。
void unique();
int main()
{list<int> lt;lt.push_back(1);lt.push_back(1);lt.push_back(2);lt.push_back(4);lt.push_back(2);lt.push_back(2);lt.push_back(4);lt.push_back(3);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;lt.sort();//需要先排序lt.unique();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}
4 sort
對容器中的元素進行排序
對列表?中的元素進行排序,改變它們在容器中的位置。
void sort();
void Test15()
{list<int> lt{ 2, 1, 2, 4, 10, 11, 99, 88 };lt.sort();for (auto e : lt){cout << e << " ";}}
5? reverse?
反轉列表容器 中元素的順序
void reverse()void reverse()
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;lt.reverse();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}
七 總結?
list終于抽時間寫完了, 首先本節大多數代碼實驗, 理論講解少, 還是那句話, 如果對概念不清楚, 請到 string看, 或者翻閱文檔, 這些都是最基本的素養.? list 很多操作和 vector一樣的, 但也有差別, 注意區分即可.
今天去中醫看病, 醫生說 眼睛就是你的腎, 舌頭是你的心臟, 大家一定注意飲食規律, 不要久坐啊.