Помогите понять пример кода класса для C ++, шаблоны, operator () - PullRequest
2 голосов
/ 20 июля 2010

Я не уверен точно, что делает следующий класс, который мы имеем для примера класса.В следующем коде, что делает оператор () в этом случае?Я не совсем понимаю * (начало + первый) и почти все возвращаемое выражение как то, что оцениваетсяЛюбая помощь будет отличной.Спасибо!

// IndexCompare.h - interface for IndexCompare class template
#ifndef _INDEXCOMPARE_H_
#define _INDEXCOMPARE_H_
#pragma once

template <class random_iterator>
class IndexCompare {
public:
    IndexCompare(random_iterator begin, random_iterator end)
        : begin(begin), end(end) {}

    ~IndexCompare() {}

    bool operator() (unsigned int first, unsigned int second) {
            return (*(begin + first) < *(begin + second));

    }

private:
    random_iterator begin;
    random_iterator end;
};

#endif

Ответы [ 3 ]

2 голосов
/ 20 июля 2010

Если вы спрашиваете, что делает operator (), это позволяет вам вызывать объект как функцию.См. эту статью для примера.

Если вы спрашиваете, что делает функция в вашем примере, она сравнивает значения двух элементов, указанных индексами, переданными функции.begin + first относится к элементу с индексом first, начиная с итератора begin, аналогично begin + second.*(begin + first) получает значение в этом месте.

Вы можете использовать этот класс с любым контейнером STL (который поддерживает произвольный доступ), передав пару итераторов.Например, вы можете использовать его с таким вектором:

vector<int> vec;
/* add some elements here */
IndexCompare<vector<int>::iterator> compare(vec.begin(), vec.end());

Теперь, например, вызов compare(2, 5) будет сравнивать значения vec[2] и vec[5].

0 голосов
/ 20 июля 2010

Оператор () в основном определяет функциональность для '()' относительно вашего класса. Так что в этом случае, если бы у нас был экземпляр IndexCompare с именем «ic», мы могли бы написать «ic ()», и выполнялась бы определенная функциональность, аналогично вызову функции и определению.

Надеюсь, это поможет понять расширение оператора.

0 голосов
/ 20 июля 2010

begin является итератором (думаю указатель), поэтому begin + first продвигается на первую позицию. или во втором случае на позицию второго. однако он не изменяет begin сам по себе.

* является оператором разыменования, который по существу получает значение, указываемое на

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...