c++ primer(第五版)笔记 第九章 顺序容器(3)

时间:2023-02-13 20:31:51
// 容量管理
// 将 capacity 减少到和 size() 相同
// 用于 vector string deque
// 不一定执行
// c.shrink_to_fit()

// 不重新分配内存的话,c 可以保存多少元素
// 用于 vector string
// c.capacity()

// 分配至少能容纳 n 个元素的空间
// 用于 vector string
// 不改变容器中元素的数量,仅影响预先分配多大的内存空间
// 只有当需要的内存空间超过当前容量时,reserve 调用才会改变容量,至少分配与需求一样大的空间
// 如果需求小于当前容量,容器不会退回内存空间
// c.reserve(n)

// 适配器(adaptor),使某种事物的行为看起来像另一种事物
// 都支持的操作和类型
// size_type足以保存当前类型的最大对象的大小
// value_type元素类型
// container_type实现适配器底层容器类型
// A a创建一个空适配器
// A a(c)创建一个适配器,带有容器 c 的一个拷贝
// ==, !=, >, >=, <, <=
// a.empty()若 a 包含任何元素,返回 false, 否则返回 true
// a.size()返回 a 中元素数目
// swap(a,b)
// a.swap(b)交换 a 和 b 的内容,必须相同的类型,包括底层容器类型也必须相同

// stack栈适配器,默认基于 deque 实现
// 需要 push_back pop_back back 操作,可以用除 array,forward_list 外的其他容器构造
// s.pop()删除栈顶元素,但不返回该值
// s.top()返回栈顶元素,但不将其弹出
// s.push(t)创建一个元素,压入栈顶,该元素通过拷贝或移动 t 获得,或由 args 构造
// s.emplace(args)

// queue 队列适配器,默认由 deque 实现,first-in,first-out (FIFO),队尾插入,队首删除
// 需要 push_back back push_front front,可用 list deque 构造,不能是vector
// q.back() 返回尾元素,但不删除此元素

// priority_queue队列适配器,,默认由 vector 实现,按优先级,将元素插入所有优先级低于他的元素之前
// 需要 front push_back pop_back,以及随机访问能力,可以用 vector deque 构造,不能是 list
// q.top()返回最高优先级的元素,但不删除此元素

// 队列通用
// q.pop()返回 queue 的首元素或 priority_queue 最高优先级的元素,但不删除此元素
// q.front()返回首元素,但不删除此元素
// q.push(t)创建一个元素,压入栈顶,该元素通过拷贝或移动 t 获得,或由 args 构造
// q.emplace(args)在 queue 末尾或 priority_queue 中恰当的位置创建一个元素,值为 t,或由 args 构造

#include<vector>
#include<iostream>
#include<string>
#include<stack>
using std::vector;
using std::string;
using std::stack;
using std::endl;
using std::cout;
using std::cin;

int main()
{
vector<int> vi{2,53,23};
cout << "capacity:"<<vi.capacity() <<endl;
cout << "size:"<<vi.size() <<endl;

vi.pop_back();
cout << "capacity:"<<vi.capacity() <<endl;
cout << "size:"<<vi.size() <<endl;

vector<string> vs;
vs.reserve(5);
cout << "before_capacity:"<<vs.capacity() <<endl;
cout << "before_size:"<<vs.size() <<endl;

string word;

while (cin >> word)
vs.push_back(word);
vs.resize(vs.size() + vs.size() / 2);
cout << "after_capacity:"<<vs.capacity() <<endl;
cout << "after_size:"<<vs.size() <<endl;
}