Ⅲ. list 容量操作
0x00 size 返回有效节点个数
size() 用于返回 list 中有效节点的个数。
💬 size:
void list_test6() { list<int> L; L.push_back(1); L.push_back(2); L.push_back(3); L.push_back(4); for (auto e : L) cout << e << " "; cout << endl; cout << "有效节点个数:"; cout << L.size() << endl; }
🚩 运行结果如下:
0x01 empty 检测容器是否为空
(之前讲 string 和 vector 的时候忘记提了)
empty 是用来检测容器是否为空的,如果为空则返回 true,否则返回 false。
这个我们在数据结构章节自己都实现过,返回一个布尔值:
💬 empty:
void list_test7() { list<int> L; L.empty() == true ? cout << "为空" : cout << "不为空"; }
🚩 运行结果如下:
0x02 resize 调整容器大小
list 中的 resize 和之前的 resize 的 "扩容" 有点不一样,它没有容量。
这里的 resize 是调整容器的大小,使其包含 个元素。
💬 用 resize 在 L 后面插入10 个 5:
void list_test8() { list<int> L; L.push_back(1); L.push_back(2); L.push_back(3); L.push_back(4); for (auto e : L) cout << e << " "; cout << endl; L.resize(10, 5); // 插入10个5 for (auto e : L) cout << e << " "; cout << endl; }
🚩 运行结果如下:
Ⅳ. 其他操作
0x00 reverse 逆置
用来逆置 list 中的元素。 (注意是 reverse,不是 reserve)
💬 将 L 的元素逆置:
void list_test9() { list<int> L; L.push_back(1); L.push_back(2); L.push_back(3); L.push_back(4); for (auto e : L) cout << e << " "; cout << endl; L.reverse(); // 将L的元素逆置 for (auto e : L) cout << e << " "; cout << endl; }
🚩 运行结果如下:
0x01 sort 排序
💬 用 sort 对 L 中的元素进行排序:
void list_test9() { list<int> L; L.push_back(4); L.push_back(2); L.push_back(6); L.push_back(1); for (auto e : L) cout << e << " "; cout << endl; L.sort(); // 对L进行排序 for (auto e : L) cout << e << " "; cout << endl; }
🚩 运行结果如下:
(从小到大排序)
0x02 unique 去重
去重之前是有要求的,去重之前一定要先排序!如果不排序可能会去不干净。
💬 unique:
void list_test11() { list<int> L; L.push_back(2); L.push_back(1); L.push_back(2); L.push_back(1); for (auto e : L) cout << e << " "; cout << endl; L.sort(); // 去重前排个序 cout << "去重后:"; L.unique(); for (auto e : L) cout << e << " "; cout << endl; }
🚩 运行结果如下:
💬 如果不排序,会导致去不干净情况发生:
void list_test11() { list<int> L; L.push_back(2); L.push_back(1); L.push_back(2); L.push_back(1); for (auto e : L) cout << e << " "; cout << endl; // L.sort(); // 去重前排个序 cout << "去重后:"; L.unique(); for (auto e : L) cout << e << " "; cout << endl; }
0x03 remove 直接爽删
remove 可比 erase 爽太多,remove 只需要给一个元素的值,它就可以自己找自己删!
erase 还需要搞个搞个迭代器,然后还要 if 判断一下,但 remove 就不一样了。
💬 remove:
void list_test12() { list<int> L; L.push_back(10); L.push_back(20); L.push_back(30); L.push_back(40); for (auto e : L) cout << e << " "; cout << endl; // 如果删一个存在的元素 L.remove(10); for (auto e : L) cout << e << " "; cout << endl; // 如果待删元素不存在 L.remove(0); for (auto e : L) cout << e << " "; cout << endl; }
🚩 运行结果如下:
自己去找自己去删,就是爽。而且就算要删元素不存在,也没有关系。
补充:remove() 函数用于从列表中删除所有出现的给定元素,而 remove_if() 函数用于从 list 中删除某些特定元素的集合。
0x04 splice 接合
简单来说就是把一个链表转移到另一个链表里去。LRUCache,访问一个数据要调优先级的时候就用得到这个接口。我们这里先简单介绍一下。
💬 把 L2 的内容,接到 L1 的 begin() 前面:
void list_test13() { list<int> L1; L1.push_back(1); L1.push_back(2); L1.push_back(3); cout << "L1: "; for (auto e : L1) cout << e << " "; cout << endl; list<int> L2; L2.push_back(10); L2.push_back(20); L2.push_back(30); cout << "L2: "; for (auto e : L2) cout << e << " "; cout << endl; list<int>::iterator pos = L1.begin(); L1.splice(pos, L2); // 把L2的内容,接到L1的begin()前面 cout << "接合后:"; for (auto e : L1) cout << e << " "; cout << endl; }
🚩 运行结果如下:
















