Лучший способ вернуть диапазон итератора преобразования

Допустим, я хочу написать простую функцию keys это занимает std::map и возвращает iterator_range это обеспечивает ключи карты. Как бы я это сделал?

template<typename A, typename B>
Range<A> keys(const std::map<A, B> & m) { ??? }

Я хочу применить один и тот же шаблон к различным другим контейнерам, но я думаю, что это хороший пример-прототип.

Редактировать: Я предполагаю, что мне нужно что-то в сфере Boost’s range_adapterи / или transform_iteratorс, но я недостаточно знаком с ними, чтобы применить их здесь.

3

Решение

Эта особая потребность удовлетворяется boost::adapters::keys, В более общем смысле, boost::range позволяет создавать собственные адаптеры, но это несколько сложнее. Так что, если вы не разрабатываете новую библиотеку, вы можете сойти с рук transformed,

Если вам нужен результат вашего диапазона обратно в контейнер, вы можете написать простой collect функция, которая будет «собирать» результат boost::range трубопровод.

template<typename Output, typename SinglePassRange>
Output collect(const SinglePassRange & rng)
{
Output r;
boost::range::copy(rng, std::inserter(r, boost::begin(r)));
return r;
}

Теперь вы можете легко набрать несколько маленьких функций и

  • collect<vector<int>>(numbers | filtered(odd))
  • collect<vector<int>>(numbers | transformed(doubled))
  • collect<vector<K>>(myMap | transformed(keyOf))
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]