Синтаксис классов/структур c++

194
29 августа 2018, 13:30

Имеется такой класс для, например, вывода вектора через библиотеку algorithm. Объясните по какому принципу myobject работает в коде и что это вообще такое?

struct myclass {          
void operator() (int i) {std::cout << ' ' << i;}
} myobject;

for_each (myvector.begin(), myvector.end(), myobject);
Answer 1
  1. Шаблонная функция std::for_each внутри себя пробегает в цикле по всему диапазону итераторов, который вы ей передали: от myvector.begin() до myvector.end() и для каждого итератора it в этом диапазоне выполняет следующее выражение

    myobject(*it)
  2. Компилятор видит, что myobject - это не функция, а экземпляр некоего класса myclass. В такой ситуации компилятор расценивает выражение myobject(*it) как вызов

    myobject.operator()(*it)

    А это и есть вызов вашего метода класса с аргументом *it, т.е. с очередным значением из вектора.

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

READ ALSO
Как выбрать все item в QTreeWidget, которые отмечены?

Как выбрать все item в QTreeWidget, которые отмечены?

Как выбрать все Item в QTreeWidget у которых статус Qt::Checked

195
Создание потока в методе класса

Создание потока в методе класса

Не получается создать поток thread (c++11) внутри метода класса - каждый раз ошибка компиляции:

179
Segmentation fault в реализации класса Any

Segmentation fault в реализации класса Any

В процессе изучения C++ решал вот эту задачуЕсли кратко, то экземпляры нешаблонного класса Any (который и нужно реализовать) должны иметь способность...

190
Ubuntu, gcc, сборка so, не работают try..catch

Ubuntu, gcc, сборка so, не работают try..catch

Собираю библиотеку Libso (Ubuntu, gcc 5

158