1.顺序容器包括哪三种?各自以什么数据结构作为基础?都有些什么特点? 2.容器的共性是什么? 3.容器适配器与标准容器之间有什么关系? 4.关联容器都有哪几种?各自有什么特点? 5.表5.6从多个方面对本章所介绍的容器进行了比较,完善各种容器的比较 vector、deque、list、set、map、unordered_set的底层数据结构、主要成员函数、是否支持[]与at()、数据插入方法、数据删除方法、成员是否有序、迭代器类型 6.请从运行效率和返回值等方面比较list 与vetor的成员函数erase之间的差异,并自行设计程序验证。
时间: 2024-01-13 15:03:18 浏览: 85
C++ 顺序容器基础知识总结
5星 · 资源好评率100%
好的,让我来一一回答你的问题。
1. 顺序容器包括 vector、deque 和 list 三种。它们的基础数据结构分别是动态数组、双端队列和双向链表。其中,vector 在尾部插入和删除元素的时间复杂度为 O(1),在其他位置插入和删除的时间复杂度为 O(N);deque 在两端插入和删除元素的时间复杂度均为 O(1);list 在任意位置插入和删除元素的时间复杂度均为 O(1)。另外,vector 和 deque 支持随机访问,而 list 不支持。
2. 容器的共性包括:存储数据、提供访问数据的接口、实现数据的插入和删除、管理数据的内存分配和释放。
3. 容器适配器与标准容器之间的关系是,容器适配器是在标准容器的基础上提供了一些额外的功能,如 stack 和 queue 分别基于 deque 和 list 实现,提供了后进先出和先进先出的操作。
4. 关联容器包括 set、multiset、map 和 multimap 四种。其中,set 和 multiset 存储的是有序不重复的元素,map 和 multimap 存储的是有序键值对,键是唯一的。set 和 map 的底层实现是红黑树,multiset 和 multimap 的底层实现也是红黑树,但允许有重复的元素或键。
5. 表5.6对本章所介绍的容器进行了比较,包括底层数据结构、主要成员函数、是否支持[]与at()、数据插入方法、数据删除方法、成员是否有序、迭代器类型等方面。
6. 在运行效率方面,vector 的 erase 操作的时间复杂度为 O(N),因为要将后面的元素向前移动,而 list 的 erase 操作的时间复杂度为 O(1),因为只需要修改指针。在返回值方面,vector 的 erase 函数返回的是指向删除元素后一个元素的迭代器,而 list 的 erase 函数返回的是指向下一个元素的迭代器。下面是一个简单的程序,展示了 vector 和 list 的 erase 函数的差异:
```c++
#include <iostream>
#include <vector>
#include <list>
int main()
{
std::vector<int> vec{1, 2, 3, 4, 5};
auto itv = vec.erase(vec.begin() + 2); // 删除元素3
for (auto i : vec)
std::cout << i << " "; // 输出:1 2 4 5
std::cout << "\n";
std::cout << *itv << "\n"; // 输出:4
std::list<int> lst{1, 2, 3, 4, 5};
auto itl = lst.erase(++lst.begin()); // 删除元素2
for (auto i : lst)
std::cout << i << " "; // 输出:1 3 4 5
std::cout << "\n";
std::cout << *itl << "\n"; // 输出:3
return 0;
}
```
阅读全文