Имеется такой класс для, например, вывода вектора через библиотеку 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, то не только в таких случаях его целесообразно использовать. К примеру, можно вызвать метод для каждого обьекта последовательности...
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости