#cpp
Имеется такой класс для, например, вывода вектора через библиотеку algorithm. Объясните по какому принципу myobject работает в коде и что это вообще такое? struct myclass { void operator() (int i) {std::cout << ' ' << i;} } myobject; for_each (myvector.begin(), myvector.end(), myobject);
Ответы
Ответ 1
Шаблонная функция std::for_each внутри себя пробегает в цикле по всему диапазону итераторов, который вы ей передали: от myvector.begin() до myvector.end() и для каждого итератора it в этом диапазоне выполняет следующее выражение myobject(*it) Компилятор видит, что myobject - это не функция, а экземпляр некоего класса myclass. В такой ситуации компилятор расценивает выражение myobject(*it) как вызов myobject.operator()(*it) А это и есть вызов вашего метода класса с аргументом *it, т.е. с очередным значением из вектора.Ответ 2
В вашем примере производится вызов оператора 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(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, то не только в таких случаях его целесообразно использовать. К примеру, можно вызвать метод для каждого обьекта последовательности...
Комментариев нет:
Отправить комментарий