Nano Hash - криптовалюты, майнинг, программирование

Получить каждый n-й элемент диапазона итератора

Существует ли какая-либо стандартная реализация (имеется в виду stdlib или boost) итератора, который обертывает другой итератор и дает только каждый n-й его элемент?

Сначала я подумал, что это возможно с подходящим предикатом и boost::filter_iterator, но предикат получает только значение, а не базовый итератор, поэтому он не может определить расстояние до начала.

Изменить
Чтобы дать дополнительную информацию: итератор должен быть совместим с такими функциями, как std::transform или std::copy. Поэтому его следует использовать как итераторы stdlib.

Похожие вопросы:
C++/STL: std::transform с заданным шагом?
Шаг неединичного итератора с неслучайным доступ к итераторам

04.10.2012

  • Разве вы не можете сделать, например. it += x себя? Или использовать std::advance? 04.10.2012
  • Нет, я не могу этого сделать, так как это вне моей досягаемости. Я хочу передать итератор функции с таким интерфейсом, как fn(beginIterator, endIterator). 04.10.2012
  • Выполните поиск, например. c++ iterator adaptor 04.10.2012
  • Ну, вопрос был о существующем, чтобы я мог не делать это самостоятельно. (Боюсь, что есть некоторые крайние случаи, когда реализация не так тривиальна.) Я уже искал некоторые, но я не знаю ключевых слов, чтобы найти точную проблему, с которой я столкнулся. 04.10.2012

Ответы:


1

Boost.Range предоставляет шаговый адаптер. Использование boost::begin/boost::end даст вам связанные итераторы.

04.10.2012
  • Я думаю, это то, что я ищу. Не могу поверить, что не запомнил stride как слово, которое искал. 04.10.2012
  • Боюсь, что мне это бесполезно, так как я не использую диапазоны Boost. 04.10.2012
  • @Nobody Тогда вы можете изменить свой вопрос. 04.10.2012
  • Кажется, что можно вырвать strided_iterator/make_strided_iterator из boost::range_detail, но я предполагаю, что нет никакой гарантии, что они останутся, если они находятся в пространстве имен деталей. 04.10.2012
  • @Nobody: Что вы имеете в виду, когда говорите, что не используете диапазоны Boost? Диапазон увеличения — это концепция, которая моделируется многими типами, включая стандартные контейнеры (std::list, std::vector и т. д.) и пару итераторов (std::pair<iterator_type, some_iterator>). Таким образом, я действительно не понимаю, как вы могли бы не использовать диапазоны Boost (если у вас есть два итератора, обозначающие начало и конец, то вы можете сделать из него диапазон Boost, просто поставив их в пару). 04.10.2012
  • И, как сказал Люк, если вы хотите работать с итератором шага, а не с диапазоном шага, вы всегда можете использовать begin и end для получения базовых итераторов. 04.10.2012
  • Обратите внимание, однако, что strided — это однопроходный диапазон, а это означает, что вы не сможете использовать его со всеми алгоритмами. 04.10.2012
  • @LucTouraille: Эти два Люка немного сбивают с толку :) На самом деле я до сих пор не смотрел на Boost.Range. Мне показалось, что это тип, который несовместим с функциями итератора stdlib. 04.10.2012
  • @Nobody Для дальнейшего использования различные библиотеки, составляющие коллекцию библиотек Boost, обозначаются точкой: Boost.MPL, Boost.Iterators, Boost.Proto, Boost.Range и т. д. Сущность в пространстве имен boost определяется с помощью помощь от оператора разрешения области видимости: boost::pair, boost::reference_wrapper и т. д. 04.10.2012

  • 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;
     };
    
    04.10.2012
  • Хотя это будет работать для прямой итерации, это не сработает для более сложных шаблонов доступа. 04.10.2012
  • Какие именно узоры? Вопрос касается Get each nth element. 04.10.2012
  • Вы правы в том, что мой вопрос требует только прямой итерации. Я думал о таких шаблонах, как: вперед и назад или бинарный поиск. 04.10.2012
  • ага, хорошо - в таком случае вы правы: для этих сценариев это не сработает. 04.10.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..