Учитывая вектор структур, как я могу получить итератор для определенного члена каждой структуры?

avatar
Kerrick Staley
8 апреля 2018 в 06:48
65
0
0

Допустим, у меня есть эта структура:

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) {
    ...
}

Есть ли простой способ сделать это (без определения моего собственного пользовательского итератора с нуля)?

Источник
user202729
8 апреля 2018 в 06:50
0

Можете ли вы изменить свою структуру (скажем, operator int)?

Nico Schertler
8 апреля 2018 в 06:52
4

Если у вас есть boost, вы можете использовать transform_iterator. Если нет, вам, вероятно, придется написать свой собственный.

StoryTeller - Unslander Monica
8 апреля 2018 в 06:52
0

Вы исключительно против того, чтобы сделать итератором? Как насчет использования библиотеки?

user202729
8 апреля 2018 в 06:55
0

@JonathanPotter Речь шла о преобразовании векторов, речь идет о преобразовании итераторов. Почти совпадает, но для этого нужно перегрузить * ++ --, а не [].

juanchopanza
8 апреля 2018 в 06:59
1

Я второй комментарий о boost::transform_iterator Я использовал его в прошлом именно для таких вещей.

Arash
8 апреля 2018 в 07:05
0

Как вы думаете, копирование будет дороже, чем изменение итератора для этого конкретного примера (с точки зрения ЦП, а не ОЗУ)?

Ap31
8 апреля 2018 в 07:07
0

что не так с определением собственного пользовательского итератора? буквально занимает 4 строки кода - ideone.com/9deAbt

Mikhail
8 апреля 2018 в 07:11
0

process_some_numbers должен быть определен, чтобы принять функтор

Daniel Jour
8 апреля 2018 в 07:52
0

@ Ap31 Хотя этот минимальный пример может работать в большинстве случаев, вам все равно необходимо указать правильный typedef (например, чтобы std::iterator_traits<I>::reference был правильным типом, см. en.cppreference.com/w/cpp/concept/ Форвардитератор)

Dean Song
8 апреля 2018 в 07:54
0

Почему бы не использовать std::for_each или другой подобный метод? Вам нужно только определить свою функцию настройки, как обрабатывается MyStruct.

Ответы (0)