【发布时间】:2014-12-04 15:50:09
【问题描述】:
我有一个读取文件夹中文件的函数(为此我使用了 boost)。我也试图只保留 2 个文件(它们是日志文件,所以它们被轮换,我不想在第三个文件中保留旧日志 = 日志)。我将文件名存储在一个列表中,但由于读取不是按创建时间顺序完成的,我需要对列表进行排序。
我知道
向量擅长:
- 通过位置索引(恒定时间)访问各个元素。
- 以任何顺序(线性时间)迭代元素。
- 从其末尾添加和删除元素(恒定摊销时间)。
和
列出容器的优点:
- 在容器中的任何位置高效插入和移除元素 (恒定时间)。
- 容器内甚至不同容器之间的高效移动元素和元素块(恒定时间)。
- 以正向或反向顺序(线性时间)迭代元素。
我不确定最好的方法是什么:使用列表还是向量?
我可以
- 使用向量并按升序排序、从末尾删除、添加新元素(在末尾)、重新排序等; 或
- 使用列表并升序排序,从头删除,在末尾添加新元素,度假村等;
- 是否只需要在开头进行排序,因为我插入的每个文件名都是最后创建的?
- 如果列表/向量已经排序,那么什么时候重新排序呢?
- 如果我使用
std::is_sorted可以不每次都排序吗?
更多信息:
因为boost的文件轮换没有“remove file if too many”的状态,只有“磁盘上有足够的空间”,所以我实现了保留最后两个文件的这一步,或者每次a都删除最旧的文件新的一个被创建并且有 2 个日志文件。因此,每次创建新的日志文件时,我都会验证文件列表,如果有足够的(2 个或更多),只需删除旧的。因为文件名是logs_%N.log,所以我不知道文件logs_X1.log是否早于logs_X2.log
eg:我重新启动应用程序,有logs_51.log、logs_52.log文件,要删除哪一个?假设它要删除logs_51.log并创建logs_0.log,如果我重新启动它,就会有logs_52.log和logs_0.log。现在要删除哪一个?)
这就是我需要排序的原因,因为应用程序可能会重新启动,并且我会读取现有文件,完成具有更多空间的文件,然后创建一个新文件。
【问题讨论】:
-
如果只有两个文件,排序的目的是什么,甚至根本就没有容器?
-
我说差异并不重要,不必担心。您正在优化一些花费很少时间的东西。而且它不像你会在一个循环中调用数十亿次。
-
use vector and sort it ascending, delete from the end, add new element (at the end), reorder, etc毫无意义。在开头插入比在结尾插入和排序要快得多。 -
@user2079303 不确定该建议来自何处 - 在
vector末尾插入通常更快,因为它避免了将项目随机排列。 -
@sop 好的,所以您实际上是在谈论 2 元素容器!您在这里询问的任何选择都不会产生任何影响。