从一个文件中讲稿未知数目的整数。对这些整数排序,然后把它们输出到标准输出设备。选用vector、deque 还是 list?

简介: 从文件读取未知数量的整数,排序后输出。选用`std::vector`因其能高效读取大量数据至连续内存,直接使用内置排序,提升缓存效率。避免使用`std::deque`和`std::list`,前者内存管理开销大,后者排序及随机访问较慢。

从一个文件中讲稿未知数目的整数。对这些整数排序,然后把它们输出到标准输出设备。选用vector、deque 还是 list?

在这个场景中,我们需要从一个文件中读取未知数目的整数,然后对这些整数进行排序并输出到标准输出设备。

选择 std::vector

理由

  • 高效读取: 对于从文件中读取大量数据的情况,std::vector 可以一次性读取整个文件到一个大的连续的内存块中,这通常比逐个插入到其他容器中更有效率。
  • 排序功能: std::vector 有 sort 成员函数,可以直接对vector中的元素进行排序。
  • 内存连续性: 连续的内存布局有助于提高缓存的效率。

    优点:

  • 一旦读取所有整数,可以一次性对整个 vector 进行排序,这比逐个插入到 std::list 或 std::deque 然后排序要高效得多。

不选择 std::deque

理由

  • 频繁重新分配: std::deque 需要在插入或删除时管理多个节点的内存分配,如果频繁进行这种操作,可能会导致多次内存重新分配和复制,从而降低效率。
  • 不必要的高内存开销: 如果不使用双端特性,std::deque 的内存分配模式可能不如 std::vector 高效。

    不选择 std::list

    理由

  • 插入和删除慢: 虽然可以在 std::list 的任意位置插入和删除元素,但这种操作的时间复杂度为 O(1),但排序操作的时间复杂度是 O(n log n)。对于大量的整数,这会变得非常耗时。
  • 随机访问慢: 与 std::deque 和 std::vector 相比,std::list 的随机访问速度较慢。

    结论

    对于这个任务,std::vector 是最合适的选择。

代码示例

#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>

int main() {
    std::ifstream file("input.txt"); // 假设整数存储在 "input.txt" 文件中
    std::vector<int> numbers;

    if (!file.is_open()) {
        std::cerr << "Unable to open file." << std::endl;
        return 1;
    }

    int number;
    while (file >> number) {
        numbers.push_back(number);
    }

    std::sort(numbers.begin(), numbers.end()); // 对整数进行排序

    for (int num : numbers) {
        std::cout << num << std::endl; // 输出到标准输出
    }

    file.close();
}
相关文章
|
10月前
|
存储 Cloud Native Linux
C++ 什么时候使用 vector、list、以及 deque?
C++ 什么时候使用 vector、list、以及 deque?
|
10月前
|
存储 Cloud Native Linux
C++ 什么时候使用 vector、list、以及 deque?
C++ 什么时候使用 vector、list、以及 deque?
|
3月前
|
存储 算法 C++
C++一分钟之-容器概览:vector, list, deque
【6月更文挑战第21天】STL中的`vector`是动态数组,适合随机访问,但插入删除非末尾元素较慢;`list`是双向链表,插入删除快但随机访问效率低;`deque`结合两者优点,支持快速双端操作。选择容器要考虑操作频率、内存占用和性能需求。注意预分配容量以减少`vector`的内存重分配,使用迭代器而非索引操作`list`,并利用`deque`的两端优势。理解容器内部机制和应用场景是优化C++程序的关键。
46 5
|
3月前
|
存储 安全 Java
Java集合详解:Set, Map, Vector, List的对比与联系
Java集合框架核心包括List、Set、Map和Vector。List允许重复元素,如ArrayList(适合读取)和LinkedList(适合插入删除)。Set不允许重复,有HashSet(无序)和TreeSet(排序)。Map存储键值对,HashMap(无序)和TreeMap(排序)。Vector是线程安全的ArrayList替代品,但在多线程环境下使用。选择集合类型应根据应用场景,如有序、无序、键值对需求及线程安全考虑。
|
3月前
|
C++ 容器
【c++】优先级队列|反向迭代器(vector|list)
【c++】优先级队列|反向迭代器(vector|list)
19 0
|
4月前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
35 0
|
4月前
|
存储 缓存 编译器
【C++进阶(五)】STL大法--list模拟实现以及list和vector的对比
【C++进阶(五)】STL大法--list模拟实现以及list和vector的对比
|
4月前
|
存储 C语言 C++
C++中STL常用容器(vector、deque、list、map、set)一文带你了解
C++中STL常用容器(vector、deque、list、map、set)一文带你了解
|
4月前
|
编译器 C++ 容器
STL常用之vector,list,stack,queue,deque总结与对比
STL常用之vector,list,stack,queue,deque总结与对比
|
4月前
|
C++ 容器
【C++】STL容器——探究List与Vector在使用sort函数排序的区别(14)
【C++】STL容器——探究List与Vector在使用sort函数排序的区别(14)