2017-01-09 3 views
1

Я перегрузил оператор(), чтобы выполнить сравнение для меня, и я хочу отправить его как компаратор в третий аргумент вызова функции сортировки std. Теперь этот вызов находится в другой функции-члене, которая называется threeSum. Я обнаружил, что отправка Solution() работает, но this() не работает. Каковы правила синтаксиса для этого?Как вызвать функтор из другой функции-члена того же класса?

class Solution 
{ 
public:  
    bool operator() (int i, int j) 
    { 
     return (i < j); 
    } 

    vector<vector<int> > threeSum(vector<int> & nums) 
    { 
     sort(nums.begin(), nums.end(), this()); 

     vector<vector<int> > ret_vec; 
     ... 
     return ret_vec; 
    } 
}; 

спасибо.

+0

Где я должен располагать компаратором? – simplename

+0

'sort (nums.begin(), nums.end(), std :: ref (* this));' Вам может понадобиться оператор 'const', как в' bool operator() (int i, int j) const {...} ' –

ответ

0

Причина: this() не работает, потому что this - указатель. Вы должны сначала разыменовать его.

(*this)(args); 

В вашем случае, вы должны написать следующее:

sort(nums.begin(), nums.end(), (*this)); 

Или, если вы хотите быть более явным:

Solution& this_val = *this; 
sort(nums.begin(), nums.end(), this_val); 
+0

Вызов' operator() 'с' 1' и '2' не имеет смысла,' std :: sort' должен вызывать его с помощью 2 разных аргументов, чтобы их сортировать , – Rakete1111

+0

Я пытался дать более общий ответ, но я обновил его, чтобы точно ответить на вопрос. – IanPudney

+0

Ни '' (* this)() ', ни' this_val() 'не будет компилироваться. –

0

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

vector<vector<int> > threeSum(vector<int> & nums) 
{ 
    auto mysort = [this](int i, int j) { 
    return operator()(i, j); 
    }; 
    sort(nums.begin(), nums.end(), mysort); 
    ... 
} 

Здесь функция лямбды mysort фиксирует время выполнения адреса, содержащий объект (this) и использовать его в качестве неявного аргумента operator(), который теперь могут быть использовано std::sort.

EDIT: Этот метод будет работать не только для функторов, но и для других функций-членов. Но если вы хотите использовать функтор для сортировки, то другой ответ, который дает (*this) непосредственно как 3-й аргумент sort, может быть несколько более эффективным.

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