概述
- 适配容器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。
stack<T>
- 是一个封装了
deque<T>
容器的适配器类模板,默认实现是一个后入先出的压入栈
queue<T>
- 是一个封装了
deque<T>
容器的适配器类模板,默认实现的是一个先入先出的队列
priority_queue<T>
- 是一个封装了
vector<T>
容器的适配器类模板,默认实现是一个会对元素排序,从而保证最大元素总在队列最前面的队列
stacck
- 第一个参数是储存对象的类型
- 第二个参数是底层容器的类型
1 |
std::stack<std::string> words; |
- 默认是deque,也支持其他支持back,pop_back,empty,size这些操作的容器
1 2 |
std::list<double> values {1.4, 5.144, 2.66}; std::stack<double, std::list<double>> my_stack(values); |
top
- 返回一个栈顶元素的引用
push(cosnt T& obj)
- 可以将对象副本压入栈顶
push(T&& obj)
- 以移动对象的方式将对象压入栈顶
pop
- 弹出栈顶元素
size
empty
emplace
- 用传入的参数调用构造函数,在栈顶生成对象
swap
queue
- 只能访问
queue<T>
容器适配器的第一个元素和最后一个元素 - 只能在容器的末尾添加新元素,只能从头部移除元素
1 2 3 |
std::queue<std::string> words; std::queue<std::string> copy_words {words}; |
- 默认是deque,也支持其他支持front,back,push_back,push_front,empty,size这些操作的容器
1 |
std::queue<std::string, std::list<std::string>> words; |
front
- 返回queue中第一个元素的引用
- 如果queue是常量,就返回一个常引用
- 如果queue为空,返回值是未定义的
back
- 返回queue中第一个元素的引用
- 如果queue是常量,就返回一个常引用
- 如果queue为空,返回值是未定义的
push(const T& obj)
- 在尾部添加一个元素的副本
push(T&& obj)
- 已移动的方式在尾部添加元素
pop
- 删除队列中的第一个元素
size
empty
emplace
- 用传入的参数,在队列的尾部构造出一个对象
swap
priority_queue
- priority_queue容器定义了一个元素有序排列的队列。默认队列的头部的元素的优先级最高
- 因为是一个队列,只能访问第一个元素,这也意味着优先级最高的元素总是第一个被处理
1 |
std::priority_queue<std::string> words; |
- priority_queue默认是有一个vector容器,函数对象类型
less<T>
是一个默认的排序断言。
1 2 3 |
std::priority_queue<std::string, std::vector<std::string>, std::greater<std::string>> words {std::begin(words), std::end(words)}; std::priority_queue<std::string, std::deque<std::string>> words1 {std::begin(words), std::end(words)} |
- 在底层,一个有priority_queue创建了一个堆。
push(const T& obj)
- 将对象的副本放到容器的适当位置,这通常包含一个排序操作
push(T&& obj)
- 以移动的方式将对象的副本放到容器的适当位置,这通常包含一个排序操作
emplace
- 通过传入的参数构在适当的位置构造出一个对象,这通常包含一个排序操作
top
- 返回优先级队列中的第一个元素的引用
pop
- 移除第一个元素
size
empty
swap
堆
- 堆(heaps)不是容器,而是一种特别的数据组织方式。
- 堆一般用来保存序列容器。
大顶堆
- 每个父节点总是大于或等于子节点
小顶堆
- 每个父节点总是小于或等于子节点
make_heap
1 2 3 4 |
std::vector<double> numbers {2.5, 10.0, 3.5, 6.7, 23.1, 1.5}; std::make_heap(std::begin(numbers), std::end(numbers)); std::make_heap(std::begin(nubmers), std::end(numbers), std::greater<>()); |
push_back
- 在序列末尾添加元素,然后需要用push_heap恢复堆的排序
push_heap
- 会认为最后一个元素是新元素,为了保持堆结构,会重新排序
1 2 3 4 5 |
std::vector<double> numbers {2.5, 10.0, 3.6, 6.5, 8.9, 12.3, 1.5, 7.9}; std::make_heap(std::begin(numbers), std::end(numbers), std::greater<>()); numbers.push_back(1.1); push_heap(std::begin(numbers), std::end(numbers), std::greater<>()); |
pop_heap
- 将第一个元素移到最后,并保证剩下的元素任然是一个堆。然后需要用pop_back移除最后一个元素
1 2 3 4 5 |
std::vector<double> numbers {2.5, 10.0, 3.6, 6.5, 8.9, 12.3, 1.5, 7.9}; std::make_heap(std::begin(numbers), std::end(numbers), std::greater<>()); std::pop_heap(std::begin(numbers), std::end(numbers), std::greater<>()); numbers.pop_back(); |
is_heap
- 如果元素段是堆,返回true
is_heap_until
- 返回一个迭代器,指向第一个不在堆内的元素
1 2 3 4 5 |
if (std::is_heap(std::begin(numbers), std::end(numbers))) { std::cout << "aet" << std::endl; } else { std::cout << "other" << std::endl; } |
容器中保存指针的好处
- 在容器中保持指针需要复制指针而不是它所指向的对象,通常来说复制指针要比复制对象快
- 在容器中保持指针可以得到多态性
- 存放元素基类指针的容器也可以保存其派生类的指针
- 对指针容器的内容进行排序的速度要比对象排序快
- 保存智能指针要不保存原生指针安全,因为在对象不再被引用时,自由存储区的对象会被自动删除。这样就不会产生内存泄漏。
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ C++并发编程_概念了解05/07
- ♥ C++_指针引用09/19
- ♥ 51CTO:C++语言高级课程二08/08
- ♥ C++_友元、联合体、内联、static、指针、深浅拷贝06/21
- ♥ C++并发编程 _管理线程05/07
- ♥ Boost 程序库完全开发指南:容器算法数学文件08/24