目录
一 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#include using namespace std; void Print(list
& lt) { list :: iterator it = lt.begin(); while (it != lt.end()) { cout << *it << " "; it++; } cout << endl; } int main() { list a; list b(4, 100); list c(4); list d(b.begin(), b.end()); list 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& lt) { list :: iterator it = lt.begin(); while (it != lt.end()) { cout << *it << " "; it++; } cout << endl; } int main() { list lt1{ 1, 2, 3, 4, 5 }; Print(lt1); return 0; }
二 list迭代器
这里我代码直接演示了, 不说概念, string章节已经讲过了, 而且list模式和vector如出一辙
注意:
ist的迭代器是支持++和--操作的(前后缀都支持)
但是不支持+和-操作,因为链表不能进行随机访问操作,只能O(n)查询
1 begin && end
iterator begin();const_iterator begin() const; iterator end();const_iterator end() const;
void Test3() { listlt(4, 1); list ::iterator it = lt.begin(); while (it != lt.end()) { cout << *it << ' '; ++it; } cout << endl; const list llt(4, 10); list ::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() { listlt(5); list ::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() { listlt1; if (lt1.empty()) cout << "empty" << endl; else cout << "full" << endl; list lt2{ 1, 2, 3, 4 }; cout << "lt1: " << lt1.size() << " lt2: " << lt2.size() << endl; }
四 list 修改操作
1 assign
将新内容分配给 list 容器,替换其当前内容,并相应地修改其大小。
range (1) templatevoid assign (InputIterator first, InputIterator last); fill (2) void assign (size_type n, const value_type& val);
void Test6() { std::listfirst; std::list 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() { listlt = { 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() { listlt = { 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) templatevoid insert (iterator position, InputIterator first, InputIterator last);
void Test9() { listlt(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() { listlt{ 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() { listl1(4, 10); list 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() { listmylist; for (int i = 1; i < 10; ++i) mylist.push_back(i); mylist.resize(5); cout << "mylist contains:"; for (std::list ::iterator it = mylist.begin(); it != mylist.end(); ++it) std::cout << ' ' << *it; cout << endl; mylist.resize(8, 100); cout << "mylist contains:"; for (std::list ::iterator it = mylist.begin(); it != mylist.end(); ++it) std::cout << ' ' << *it; cout << endl; mylist.resize(12); cout << "mylist contains:"; for (std::list ::iterator it = mylist.begin(); it != mylist.end(); ++it) std::cout << ' ' << *it; cout << endl; }
8 clear
从容器中删除所有元素(这些元素被销毁),使容器的大小为0。
void clear() noexcept;
void Test13() { listlt(1, 4); lt.clear(); cout << lt.size() << endl; for (auto e : lt) { cout << e << ' '; } cout << endl; }
9 关于 emplace系列操作说明
这个系列的操作放在 右值引用讲解完之后再讲, 这样才能更好的理解. 大家不需要着急的, 因为 上面讲的完全够用, 而且emplace 是优化, 并不是其他功能
五 list 元素访问
void Test13() { listlt{ 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() { listmylist1 = { 1, 2, 3, 4 }, mylist2 = { 10, 20, 30 }; list ::iterator it = mylist1.begin(); ++it; // points to 2 mylist1.splice(it, mylist2); // mylist1: 1 10 20 30 2 3 4 cout << "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() { listlt; 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() { listlt; 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() { listlt{ 2, 1, 2, 4, 10, 11, 99, 88 }; lt.sort(); for (auto e : lt) { cout << e << " "; } }
5 reverse
反转列表容器 中元素的顺序
void reverse()void reverse()
int main() { listlt; 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一样的, 但也有差别, 注意区分即可.
今天去中医看病, 医生说 眼睛就是你的肾, 舌头是你的心脏, 大家一定注意饮食规律, 不要久坐啊.
还没有评论,来说两句吧...