对于下面的程序任务,vector、deque 和 list 哪种容器最为合适?解释你 的选择的理由。如果没有哪一种容器优于其他容器,也请解释理由。(练习 9.1) (1) 读取固定数量的单词,将他们按字典序插入到容器中。 (2) 读取未知数量的单词,总是将新单词插入到末尾。删除操作在头部进行。 (3) 从一个文件读取未知数量的整数。将这些数排序,然后将他们打印到标 准输出
时间: 2023-06-03 14:06:54 浏览: 258
答案:对于第一个任务,最适合的容器是 set,因为它可以自动维护元素的有序性;对于第二个任务,最适合的容器是 deque,因为它支持在头部进行快速的删除操作,同时又可以在尾部进行快速的插入操作;对于第三个任务,最适合的容器是 vector,因为它支持随机访问,并且在排序后可以很方便地打印到标准输出。因此,并没有一种容器优于其他容器,不同的任务需要选择不同的容器来完成。
相关问题
对于下面的程序任务,vector、deque 和 list 哪种容器最为合适?解释你的选择的理由。如果没有哪一种容器优于其他容器,也请解释理由。(练习9.1)(1) 读取固定数量的单词,将他们按字典序插入到容器中。(2) 读取未知数量的单词,总是将新单词插入到末尾。删除操作在头部进行。(3) 从一个文件读取未知数量的整数。将这些数排序,然后将他们打印到标准输出。
对于第一个任务,最适合的容器是set,因为它可以自动按照字典序排序,而且不允许重复元素的存在。如果需要保留重复元素,则可以使用multiset。
对于第二个任务,最适合的容器是deque,因为它可以在头部和尾部进行插入和删除操作,而且支持随机访问。
对于第三个任务,最适合的容器是vector,因为它可以在末尾进行插入操作,而且支持随机访问。排序可以使用STL中的sort函数。
1.顺序容器包括哪三种?各自以什么数据结构作为基础?都有些什么特点? 2.容器的共性是什么? 3.容器适配器与标准容器之间有什么关系? 4.关联容器都有哪几种?各自有什么特点? 5.表5.6从多个方面对本章所介绍的容器进行了比较,完善各种容器的比较 vector、deque、list、set、map、unordered_set的底层数据结构、主要成员函数、是否支持[]与at()、数据插入方法、数据删除方法、成员是否有序、迭代器类型 6.请从运行效率和返回值等方面比较list 与vetor的成员函数erase之间的差异,并自行设计程序验证。
好的,让我来一一回答你的问题。
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;
}
```
阅读全文