Допустим, у меня есть эта структура:
struct MyStruct {
int my_member;
};
и это vector
:
vector<MyStruct> my_vec = ...;
Допустим, я хочу передать все эти my_member
значения функции, которая ожидает итератор чисел:
template<class iterator_type>
double process_some_numbers(iterator_type begin, iterator_type end) {
...
}
Есть ли простой способ сделать это (без определения моего собственного пользовательского итератора с нуля)?
Можете ли вы изменить свою структуру (скажем,
operator int
)?Если у вас есть boost, вы можете использовать
transform_iterator
. Если нет, вам, вероятно, придется написать свой собственный.Вы исключительно против того, чтобы сделать итератором? Как насчет использования библиотеки?
@JonathanPotter Речь шла о преобразовании векторов, речь идет о преобразовании итераторов. Почти совпадает, но для этого нужно перегрузить
*
++
--
, а не[]
.Я второй комментарий о
boost::transform_iterator
Я использовал его в прошлом именно для таких вещей.Как вы думаете, копирование будет дороже, чем изменение итератора для этого конкретного примера (с точки зрения ЦП, а не ОЗУ)?
что не так с определением собственного пользовательского итератора? буквально занимает 4 строки кода - ideone.com/9deAbt
process_some_numbers
должен быть определен, чтобы принять функтор@ Ap31 Хотя этот минимальный пример может работать в большинстве случаев, вам все равно необходимо указать правильный typedef (например, чтобы
std::iterator_traits<I>::reference
был правильным типом, см. en.cppreference.com/w/cpp/concept/ Форвардитератор)Почему бы не использовать std::for_each или другой подобный метод? Вам нужно только определить свою функцию настройки, как обрабатывается MyStruct.