2016-10-19 2 views
1

Приветствуем вас и благодарим заранее!Функция вызова функции перегрузки() в структуре/что происходит с аргументами?

Я использую std::unique до erase от std::vector. Чтобы проверить уникальность, я вызываю логическую функцию структуры. Поскольку я хотел бы использовать предопределенный допуск, я попытался добавить конструктор, которому передается желаемое значение. Это работает, но я действительно не знаю, почему.

std::vector<std::pair<int,double> > myVec; 

struct Check{ 

    double tol_ = 0.0; 
    Check(double tol) : tol_(tol) 
    {   
    } 

    bool operator()(const std::pair<int,double> &a, 
        const std::pair<int,double> &b) 
    { 
    return fabs(a.second-b.second) < tol_; 
    } 
}; 

// fill vector 
... 

// remove duplicates 
myVec.erase(std::unique(myVec.begin(), myVec.end(), Check(0.1)), myVec.end()); 

Действительно ли это в разумной практике? Я немного смущен насчет unique. Когда эта функция будет достигнута, структура Check будет построена с использованием допуска. Следующий unique вызывает эту структуру еще несколько раз, чтобы сравнить векторные элементы, передав их в качестве ссылки?

Спасибо за ваши усилия!

+0

Почему вы делаете 'myVec-> начать()' вместо 'myVec.begin()'? – PRP

+1

Прежде всего ['std :: unique'] (http://en.cppreference.com/w/cpp/algorithm/unique) удаляет повторяющиеся * последовательные * элементы. Это означает, что ваш диапазон должен быть отсортирован. Во-вторых, 'myVec', похоже, не является указателем, использование оператора доступа к стрелкам неверно. Наконец, * как * это не работает? Не могли бы вы рассказать? –

+0

У вас есть реальный вопрос? Я имею в виду, что могу ответить только «да». это разумная практика и делается таким образом. Поэтому вы правы, как это работает. – Hayt

ответ

2

Что происходит, когда вы делаете Check(0.1) при вызове std::unique, создается временный объект. Этот временный объект будет иметь срок службы до конца полного выражения.

Временный объект передается как любой другой объект функции std::unique. Это работает, потому что этот аргумент является шаблонным аргументом и может иметь любой тип, соответствующий его использованию.

Короче вызов std::unique примерно эквивалентно что-то вроде этого:

// Enter new nested local scope 
{ 
    Check temporary_object(0.1); // Create object 
    std::unique(..., temporary_object); 
} 
// Left nested scope, the `temporary_object` is destructed 
+0

Спасибо за разъяснение! Это означает, что после создания временного объекта (в том, что вы написали как 'std :: unique (..., tempor_object);'), уникальная функция вызывает временный объект несколько раз, используя что-то вроде 'tempor_object (& a, & b) 'который был перегружен оператором bool() (...)' – AnBr

+0

@AnBr Да, это правильно. –

Смежные вопросы