Итерация ключей / значений std :: map в C ++

Мой вопрос - небольшое обобщение этого . Для обсуждения я сосредоточусь на повторении ключей карты. Я хотел бы иметь общую вспомогательную функцию key_iterator , которая принимает итератор карты и возвращает итератор ключа карты. Например, следующий код:

#include "key_iterator.hpp"
#include 
#include 
#include 
#include 

int main(int argc, char** argv)
{
    std::map m;
    m["One"] = 1;
    m["Two"] = 2;
    std::copy(key_iterator(m.begin()), key_iterator(m.end()), std::ostream_iterator(std::cout, " "));
    return 0;
}

должен выдать следующий результат:

One Two

Как предлагается в решении вопроса, упомянутого выше, boost :: transform_iterator кажется подходящей отправной точкой для реализации key_iterator . У меня есть промежуточное решение, которое выглядит так для key_iterator.hpp:

#pragma once

#include 
#include 
#include 

template 
class KeyGetter : public std::unary_function, Key>
{
public:
    const Key& operator()(const std::pair& p) const {return p.first;}
};

template
boost::transform_iterator, typename std::map::iterator>
key_iterator(typename std::map::iterator itr)
{
    return boost::make_transform_iterator, typename std::map::iterator>(itr, KeyGetter());
}

, но с этой реализацией типы Key и Value не выводятся автоматически, и мне нужно указать их вручную, чтобы заставить его скомпилировать:

std::copy(key_iterator(m.begin()), key_iterator(m.end()), std::ostream_iterator(std::cout, " "));

Any мысли о том, как заставить это работать так, как я хочу?

5
задан Community 23 May 2017 в 12:00
поделиться