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

Копия STL, пара, вектор и вставка

У меня есть ввод:

1 a
2 b
..

Я хотел бы вставить их в вектор пар с функцией копирования, например:

#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>

int main(void) {
    std::vector<std::pair<int, char>> v;
    std::copy(std::istream_iterator<std::pair<int, char>>(std::cin), std::istream_iterator<std::pair<int, char>>(), std::back_inserter(v));
    for(auto pair: v)
        std::cout << pair.first << std::endl;
    return 0;
}

Однако это не будет компилироваться: error: no match for 'operator>>', так как, вероятно, требуется перегрузка оператора.

Означает ли это, что мне придется создать свой собственный класс, который наследуется от std::vector, а затем перегрузить оператор?

Я хотел бы избежать использования своего собственного класса вместо стандартного векторного класса.


  • Вам нужно определить свою собственную реализацию для << для чтения пары как это может быть 23.10.2017
  • О, @ P0W, я так понимаю, проблема с итератором, а не с вектором! 23.10.2017
  • Нет, я немного колеблюсь делать/предлагать в пространстве имен std. Есть лучшие альтернативы, которые могут потребовать немного больше усилий. 23.10.2017

Ответы:


1

Проблема не в std::vector, а в std::istream_iterator. Причина в том, что std::pair не имеет определенного оператора десериализации.

Вы по-прежнему можете использовать std::vector и std::back_insert_iterator, но вам нужно будет определить свой собственный итератор ввода. Тот, который читает пары значений.

Некоторые люди могут предложить вам определить operator>> для ваших пар, но это ненадежный метод. Это будет зависеть от оператора, определяемого перед включением <algorithm> и <iterator>.

23.10.2017
  • А, вижу, +1! Не могли бы вы объяснить свой последний абзац? 23.10.2017
  • @gsamaras - Вот почему. Код, который вам предложили в комментарии к вашему сообщению, повторно открывает nameapce std. Мы не можем сделать это, чтобы добавить определения новых функций. Это УБ. 23.10.2017

  • 2

    Вы можете скопировать его через прокси-объект:

    #include <vector>
    #include <iterator>
    #include <algorithm>
    #include <iostream>
    
    struct proxy
    {
        friend auto operator>>(std::istream& is, proxy& prox) -> std::istream&
        {
            is >> std::get<0>(prox.target);
            is >> std::get<1>(prox.target);
            return is;
        }
    
        operator std::pair<int, char>() const {
            return target;
        }
    
        std::pair<int, char> target;
    };
    
    int main(void) {
        std::vector<std::pair<int, char>> v;
        std::copy(std::istream_iterator<proxy>(std::cin), 
                  std::istream_iterator<proxy>(), 
                  std::back_inserter(v));
        for(auto pair: v)
            std::cout << pair.first << std::endl;
        return 0;
    }
    
    23.10.2017
  • Хороший ответ. Я бы согласился, если бы в нем говорилось, что мое впечатление о том, что должно быть перегружено, было неправильным (это итератор, а не вектор). Чтобы принятый ответ был компактным. 23.10.2017
  • Новые материалы

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

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

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

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

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

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

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