概念
常用接口
1. 构造函数
stack<T> st;
// stack 采用模板类实现,默认构造函数stack<T> st1(const stack &st);
// 拷贝构造函数2. 数据存取
push(elem);
// 向栈顶添加元素pop();
// 从栈顶移除一个元素top();
// 返回栈顶元素3. 赋值操作
stack& operator=(const stack &st);
// 重载等号运算符4. 大小操作
empty();
// 判断栈是否为空size();
// 返回栈的大小#include <iostream> using namespace std; #include <stack> int main() { // 1. 构造函数 stack<int> st; stack<int> st1; // 2. 数据存取删 // 存 -- 先进后出 st.push(1); st.push(2); st.push(3); // 取栈顶元素 cout << st.top() << endl; // 3 // 删栈顶元素 st.pop(); cout << st.top() << endl; // 2 // 3. 赋值操作 st1 = st; // 取栈顶元素 cout << st1.top() << endl; // 2 // 4. 大小操作 // 判断栈是否为空 if (st.empty()) { cout << "栈为空!" << endl; } else { cout << "栈不为空!"; // 如果栈不为空,则输出栈的大小 cout << ",且栈的大小为:" << st.size() << endl; // 栈不为空!,且栈的大小为:2 } // 利用某种方式取出栈中所有元素 while (!st.empty()) { // 只要栈非空,则进入循环 // 取栈顶元素 cout << st.top() << " "; // 2 1 // 删栈顶元素 st.pop(); } cout << endl; system("pause"); return 0; }
概念
常用接口
1. 构造函数
queue<T> que;
// queue 采用模板类实现,默认构造函数queue<T> que1(const queue &que);
// 拷贝构造函数2. 数据存取
push(elem);
// 往队尾添加元素pop();
// 从队头移除一个元素front();
// 返回第一个元素back();
// 返回最后一个元素3. 赋值操作
queue& operator=(const queue &que);
// 重载等号运算符4. 大小操作
empty();
// 判断队列是否为空size();
// 返回队列的大小#include <iostream> using namespace std; #include <queue> int main() { // 1. 构造函数 queue<int> que; queue<int> que1; // 2. 数据存取 // 存 que.push(1); que.push(2); que.push(3); // 取 // 取队头的第一个元素 cout << que.front() << endl; // 1 // 取队尾的第一个元素 cout << que.back() << endl; // 3 // 删 -- 删队头的第一个元素 que.pop(); cout << que.front() << endl; // 2 // 3. 赋值操作 que1 = que; cout << que1.front() << endl; // 2 // 4. 大小操作 // 判断队列是否为空 if (que.empty()) { cout << "队列为空!" << endl; } else { cout << "队列不为空!"; // 如果队列不为空,输出队列的大小 cout << ",且队列大小为:" << que.size() << endl; // 队列不为空!,且队列大小为:2 } // 利用某种方式取出队列中所有元素 while (!que.empty()) { // 当队列不为空则进入循环 // 显示队头元素 cout << que.front() << " "; // 2 3 // 删除队头元素 que.pop(); } cout << endl; system("pause"); return 0; }
概念
》》list(链表)可以将数据进行链式存储,STL 中的链表是一个双向循环链表
》》链表(由一系列的节点组成)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针实现的
》》节点 由二部分组成,一是存储数据元素的数据域,另一个是存储下一个节点地址的指针域
重点
优点
缺点
链表灵活,但是空间(指针域)和时间(遍历)额外耗费较大
总结
STL 中 list 和 vector 是二个最常被使用的容器,各有优缺点
函数原型
list<T> li;
// list 采用模板类实现,默认构造函数list<T> li1(li.begin(), li.end());
// 构造函数将容器 li 区间元素拷贝给自身list<T> li(n, elem);
// 构造函数将 n 个 elem 拷贝给自身list<T> li1(const list &li);
// 拷贝构造函数#include <iostream> using namespace std; #include <list> void PrintList(list<int> &li) { // 利用迭代器遍历 list 容器 for (list<int>::iterator it = li.begin(); it != li.end(); it++) { cout << *it << " "; } cout << endl; } int main() { // 1. 构造函数 list<int> li; // 插入数据 for (int i = 0; i < 5; i++) { li.push_back(i + 1); } // 打印容器 list 中的元素 PrintList(li); // 1 2 3 4 5 // 2. 构造函数将容器 li 区间元素拷贝给自身 list<int> li1(li.begin(), li.end()); PrintList(li1); // 1 2 3 4 5 // 3. 构造函数将 n 个 elem 拷贝给自身 list<int> li2(6, 6); PrintList(li2); // 6 6 6 6 6 6 // 4. 拷贝构造函数 list<int> li3(li2); PrintList(li3); // 6 6 6 6 6 6 system("pause"); return 0; }
函数原型
list& operator=(const list &li);
// 重载赋值运算符li1.assign(li.begin(), li.end());
// 将 [begin, end] 区间的数据拷贝给自身li1.assign(n, elem);
// 将 n 个 elem 拷贝赋值给本身li1.swap(li);
// 容器 li 和 li1 的元素互换#include <iostream> using namespace std; #include <list> void PrintList(list<int> &li) { // 利用迭代器遍历 list 容器 for (list<int>::iterator it = li.begin(); it != li.end(); it++) { cout << *it << " "; } cout << endl; } int main() { // 构造函数 list<int> li; list<int> li1; list<int> li2; list<int> li3; // 插入数据 for (int i = 0; i < 5; i++) { li.push_back(i + 1); } PrintList(li); // 1 2 3 4 5 // 1. 重载赋值运算符 li1 = li; PrintList(li1); // 1 2 3 4 5 // 2. assign -- 将容量 li 区间元素拷贝过来 // li2.assign(li.begin(), li.begin() + 3); // 双向迭代器,不支持随机访问 li2.assign(li.begin(), ++li.begin()); PrintList(li2); // 1 // 3. assign -- 将 n 个 elem 拷贝给自身 li3.assign(6, 6); PrintList(li3); // 6 6 6 6 6 6 // 4. 互换容器 -- li3 和 li li.swap(li3); PrintList(li); // 6 6 6 6 6 6 PrintList(li3); // 1 2 3 4 5 system("pause"); return 0; }
函数原型
empty();
// 判断容器是否为空size();
// 容器的大小resize(int num);
// 重新指定容器的长度为 num,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素将被删除resize(int num, elem);
// 重新指定容器的长度为 num,若容器变长,则以 elem 填充新位置;如果容器变短,则末尾超出容器长度的元素将被删除#include <iostream> using namespace std; #include <list> void PrintList(list<int> &li) { // 利用迭代器遍历 list 容器 for (list<int>::iterator it = li.begin(); it != li.end(); it++) { cout << *it << " "; } cout << endl; } int main() { // 构造函数 list<int> li; // 1. 判断容器是否为空 if (li.empty()) { cout << "容器为空!" << endl; // 容器为空! } // 插入数据 for (int i = 0; i < 5; i++) { li.push_back(i + 1); } PrintList(li); // 1 2 3 4 5 // 2. 输出容器大小 cout << li.size() << endl; // 5 // 3. 重新指定容器长度 // 变长 -- 以默认值(0)填充新位置 li.resize(10); // 输出容器内数据 PrintList(li); // 1 2 3 4 5 0 0 0 0 0 // 变短 -- 超出长度的元素将被删除 li.resize(3); // 输出容器内数据 PrintList(li); // 1 2 3 // 4. 重新指定容器长度和新位置的默认值 // 变成 -- 以第二个参数 num 填充新位置 li.resize(5, 666); PrintList(li); // 1 2 3 666 666 // 变短 -- 超出长度的元素将被删除 li.resize(2); // 输出容器内数据 PrintList(li); // 1 2 system("pause"); return 0; }
函数原型
1. 二端插入和删除
push_back(elem);
// 在容器尾部插入一个元素push_front(elem);
// 在容器头部插入一个元素pop_back();
// 删除容器尾部第一个元素pop_front();
// 删除容器头部第一个元素#include <iostream> using namespace std; #include <list> void PrintList(list<int> &li) { // 利用迭代器遍历 list 容器 for (list<int>::iterator it = li.begin(); it != li.end(); it++) { cout << *it << " "; } cout << endl; } int main() { // 构造函数 list<int> li; // 1. 在容器尾部插入元素 li.push_back(1); li.push_back(2); li.push_back(3); PrintList(li); // 1 2 3 // 2. 在容器头部插入元素 li.push_front(4); li.push_front(5); li.push_front(6); PrintList(li); // 6 5 4 1 2 3 // 3. 删除容器头部第一个元素 li.pop_front(); PrintList(li); // 5 4 1 2 3 // 3. 删除容器尾部第一个元素 li.pop_back(); PrintList(li); // 5 4 1 2 system("pause"); return 0; }
2. 指定位置插入和删除
insert(const_iterator pos, elem);
// 迭代器指向 pos 插入元素insert(const_iterator pos, n, elem);
// 迭代器指向 pos 插入 n 个元素insert(const_iterator pos, li.begin(), li.end());
// 将容器 li 区间元素插入迭代器指向的 pos 位置erase(const_iterator pos);
// 删除迭代器指向的元素erase(const_iterator start, const_iterator end);
// 删除迭代器指向从 start 到 end 之间的元素remove(elem);
// 删除容器中所有与 elem 匹配的元素clear();
// 清空容器#include <iostream> using namespace std; #include <list> void PrintList(list<int> &li) { // 利用迭代器遍历 list 容器 for (list<int>::iterator it = li.begin(); it != li.end(); it++) { cout << *it << " "; } cout << endl; } int main() { // 构造函数 list<int> li; // 尾插法 li.push_back(1); li.push_back(2); li.push_back(3); PrintList(li); // 1 2 3 // 1. 迭代器指向位置 pos 插入元素 li.insert(li.begin(), 4); PrintList(li); // 4 1 2 3 // 2. 迭代器指向位置 pos 插入 n 个元素 li.insert(li.end(), 5, 6); PrintList(li); // 4 1 2 3 6 6 6 6 6 // 3. 将容量 li 区间元素插入迭代器指向位置 pos li.insert(++li.begin(), ++li.begin(), --li.end()); PrintList(li); // 4 1 2 3 6 6 6 6 1 2 3 6 6 6 6 6 // 4. 删除迭代器指向位置 pos li.erase(li.begin()); PrintList(li); // 1 2 3 6 6 6 6 1 2 3 6 6 6 6 6 // 5. 删除迭代器指向从 start 到 end 的元素 li.erase(++li.begin(), --(--li.end())); PrintList(li); // 1 6 6 // 6. 删除容器中所有与 elem 匹配的元素 li.remove(6); PrintList(li); // 1 // 7. 清空容器 li.clear(); PrintList(li); // 空 system("pause"); return 0; }
函数原型
front();
// 返回容器的第一个元素back();
// 返回容器最后一个元素#include <iostream> using namespace std; #include <list> void PrintList(list<int> &li) { // 利用迭代器遍历 list 容器 for (list<int>::iterator it = li.begin(); it != li.end(); it++) { cout << *it << " "; } cout << endl; } int main() { // 构造函数 list<int> li; // 尾插法 li.push_back(1); li.push_back(2); li.push_back(3); PrintList(li); // 1 2 3 // 1. 返回容器第一个元素 cout << li.front() << endl; // 1 // 2. 返回容器最后一个元素 cout << li.back() << endl; // 3 system("pause"); return 0; }
函数原型
reverse();
// 反转链表sort();
// 排序链表#include <iostream> using namespace std; #include <list> void PrintList(list<int> &li) { // 利用迭代器遍历 list 容器 for (list<int>::iterator it = li.begin(); it != li.end(); it++) { cout << *it << " "; } cout << endl; } int main() { // 构造函数 list<int> li; // 尾插法 li.push_back(1); li.push_back(7); li.push_back(3); li.push_back(5); li.push_back(6); PrintList(li); // 1 7 3 5 6 // 1. 反转链表 li.reverse(); PrintList(li); // 6 5 3 7 1 // 2. 排序链表 li.sort(); PrintList(li); // 1 3 5 6 7 system("pause"); return 0; }