【问题标题】:Get each nth element of iterator range获取迭代器范围的每个第 n 个元素
【发布时间】:2012-09-25 10:36:24
【问题描述】:

是否有一个迭代器的标准实现(即 stdlib 或 boost),它包装了另一个迭代器并只给出它的每个第 n 个元素?

我最初认为这可以通过合适的谓词和 boost::filter_iterator 来实现,但谓词只获取值而不是基迭代器,因此它无法判断到开始的距离。

编辑
提供更多信息: 迭代器应该与std::transformstd::copy 等函数兼容。 所以它应该像 stdlib 迭代器一样使用。

类似问题:
C++/STL: std::transform with given stride?
Non-unit iterator stride with non-random access iterators

【问题讨论】:

  • 你不能这样做吗? it += x你自己?还是使用std::advance
  • 不,我不能这样做,因为这超出了我的能力范围。我想将迭代器传递给一个函数,该函数的接口类似于fn(beginIterator, endIterator)
  • 搜索例如c++ iterator adaptor
  • 嗯,问题是关于现有的,所以我可以阻止自己做。 (恐怕有一些极端情况,实现起来不是那么简单。)我已经搜索了一些,但我不知道要找到我面临的确切问题的关键字。

标签: c++ boost iterator std


【解决方案1】:

Boost.Range 提供a stride adaptor。使用 boost::begin/boost::end 会为您提供关联的迭代器。

【讨论】:

  • 我认为这就是我正在寻找的。我不敢相信我不记得 stride 是我要找的词。
  • 恐怕这对我没用,因为我不使用 Boost 范围。
  • @Nobody 你可能想修改你的问题。
  • 似乎可以从boost::range_detail 中删除strided_iterator/make_strided_iterator,但我认为如果它们位于详细命名空间中,则无法保证它们会留下来。
  • @Nobody:你说你不使用 Boost 范围是什么意思? “提升范围”是一个由多种类型建模的概念,包括标准容器(std::liststd::vector 等)和一对迭代器(std::pair<iterator_type, some_iterator>)。因此,我真的不明白你为什么不能使用 Boost 范围(如果你有两个迭代器表示开始和结束,那么你可以通过将它们放在一对中来制作一个 Boost 范围)。跨度>
【解决方案2】:

您可以将boost::filter_iterator 与如下谓词一起使用:

 template< typename T, int N >
 struct EveryNth {
    bool operator()(const T&) { return m_count++ % N == 0; }
    EveryNth() : m_count(0) {}
    private:
      int m_count;
 };

【讨论】:

  • 虽然这适用于直接迭代,但在更复杂的访问模式下会失败。
  • 究竟是什么模式?问题是关于Get each nth element
  • 你说得对,我的问题只要求向前迭代。我想到了这样的模式:前进后退或二分搜索。
  • 啊哈,好吧 - 在这种情况下你是对的:它不适用于那些场景。
猜你喜欢
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多