Имеется такой класс для, например, вывода вектора через библиотеку algorithm.
Объясните по какому принципу myobject работает в коде и что это вообще такое?
struct myclass {
void operator() (int i) {std::cout << ' ' << i;}
} myobject;
for_each (myvector.begin(), myvector.end(), myobject);
Шаблонная функция std::for_each
внутри себя пробегает в цикле по всему диапазону итераторов, который вы ей передали: от myvector.begin()
до myvector.end()
и для каждого итератора it
в этом диапазоне выполняет следующее выражение
myobject(*it)
Компилятор видит, что myobject
- это не функция, а экземпляр некоего класса myclass
. В такой ситуации компилятор расценивает выражение myobject(*it)
как вызов
myobject.operator()(*it)
А это и есть вызов вашего метода класса с аргументом *it
, т.е. с очередным значением из вектора.
В вашем примере производится вызов оператора myclass::operator()(int
), для обьекта myobject
, с аргументом элемента вектора , в цикле , от myvector.begin()
до myvector.end()
(Пользователь AnT
хорошо обьяснил...)
Поэтому, в цельях избежать вызова функции N
раз(где
N == std::distance(myvector.begin(), myvector.end()) ), для вывода лучше использовать более специализированные альгоритмы, например:
std::copy(myvector.begin(), myvector.end(), ostream_iterator<int>(cout, " "));
Тут отпадает необходимость определения функтора. Но, чтобы подчеркнуть преимущество альгоритма for_each
, который в итоге возвращает свой аргумент функтор myobject
, для примера добавим поле в myclass
, для хранения суммы элементов последовательности:
struct myclass {
static int k;
void operator() (int i) { k += i; std::cout << ' ' << i;}
} myobject;
int myclass::k = 0;
Теперь с каждым вызовом оператора, к myclass::k
прибавится значение аргумента оператора. И for_each
уже становится подходящей кандидатурой в выборе альгоритма. И после:
for_each(myvector.begin(), myvector.end(), myobject); // вывод элементов
cout << endl << myobject.k; // вывод суммы элементов
Становится нагляднее работа альгоритма и ответ на ваш вопрос.
Мы будем иметь и вывод и сохраним сумму элементов myvector
в myclass::k. Конечно myclass
может хранить и более ценные информации разного рода, а не тривиальную сумму элементов...
P.S. Не в тему, но если говорить об альгоритме for_each
, то не только в таких случаях его целесообразно использовать. К примеру, можно вызвать метод для каждого обьекта последовательности...
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Как выбрать все Item в QTreeWidget у которых статус Qt::Checked
Не получается создать поток thread (c++11) внутри метода класса - каждый раз ошибка компиляции:
В процессе изучения C++ решал вот эту задачуЕсли кратко, то экземпляры нешаблонного класса Any (который и нужно реализовать) должны иметь способность...