【问题标题】:Is it possible to create a Filesystem TS basic_path from a range of path iterators or a subpath?是否可以从一系列路径迭代器或子路径创建 Filesystem TS basic_path?
【发布时间】:2015-04-29 22:23:38
【问题描述】:

我正在尝试创建 basic_path (data/images/lol.png -> images/lol.png) 的一级深层子路径。

我尝试了std::path{ ++path.begin(), path.end() } 之类的方法,但范围构造函数显然需要string_type::iterators,而不是basic_path::iterators。

我是否可以使用basic_path 方法来做我需要的事情,还是我必须使用std::accumulate( ++path.begin(), path.end() ) 之类的方法(恕我直言效率非常低)?

【问题讨论】:

  • 我很好奇你的累积问题是什么。看来你无论如何也别无选择。在性能方面,考虑到大多数情况下路径少于 200 个字符,我认为这还不错。
  • 当然,但在性能方面,它仍然是一个较慢的类(在最坏的情况下 O(1) vs O(logn) 分配),复杂性方面它更慢(O(1) vs O(n ) 在最坏的情况下)。据我所知,路径迭代器构造函数是微不足道的,所以它的丢失对我来说很奇怪。同样从我公认的糟糕记忆来看,它也是标准库中第一个带有迭代器的类的实例,它没有采用这些迭代器的构造函数。

标签: c++ stl boost-filesystem


【解决方案1】:

我能找到的最好的是

path subpath(path p) {
  auto pathString = p.native();
  auto newBegin = find(pathString.begin(), pathString.end(), path::preferred_separator);
  return path{ ++newBegin, pathString.end() };
}

它只需要一次分配,但它的时间复杂度仍然是 O(n),但是我无法想象有一种方法可以进一步加快它的速度。

它仍然比累积更快(200个字符路径):

accumulate: 31386 ns ± 5336.29
my subpath: 785.857 ns ± 422.013

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2012-11-28
    • 1970-01-01
    • 2011-02-26
    • 2019-07-02
    相关资源
    最近更新 更多