Пользовательская функция сравнения для std :: binary_search - PullRequest
1 голос
/ 04 ноября 2011

Есть ли проблемы с этим кодом?

bool Spellcheck::smart_comp(string value, string key){
    return true;
}

void func(){
    std::string aprox_key = "hello";
    if(std::binary_search(this->words.begin(), this->words.end(), aprox_key, smart_comp)){
        std::cout << "Found" << std::endl;
    }
}

Я пытаюсь написать собственную функцию сравнения для сравнения строк в двоичном поиске

Я получаю следующую ошибку:

xyz.cpp:40:85: error: no matching function for call to ‘binary_search(std::vector<std::basic_string<char> >::iterator, std::vector<std::basic_string<char> >::iterator, std::string&, <unresolved overloaded function type>)’
xyz.cpp:40:85: note: candidates are:
/usr/include/c++/4.6/bits/stl_algo.h:2665:5: note: template<class _FIter, class _Tp> bool std::binary_search(_FIter, _FIter, const _Tp&)
/usr/include/c++/4.6/bits/stl_algo.h:2698:5: note: bool std::binary_search(_FIter, _FIter, const _Tp&, _Compare) [with _FIter = __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >, _Tp = std::basic_string<char>, _Compare = bool (Spellcheck::*)(std::basic_string<char>, std::basic_string<char>)]
/usr/include/c++/4.6/bits/stl_algo.h:2698:5: note:   no known conversion for argument 4 from ‘<unresolved overloaded function type>’ to ‘bool (Spellcheck::*)(std::basic_string<char>, std::basic_string<char>)’

Любая помощь приветствуется ...

Ответы [ 3 ]

4 голосов
/ 04 ноября 2011

Есть ли проблемы с этим кодом?

bool Spellcheck::smart_comp(string const value, string const key){
  return true;
}

Кроме того, что всегда возвращает true? Да, основная проблема заключается в том, что функция-член имеет неявный параметр this, поэтому подпись не совпадает с сигнатурой ожидаемого предиката. Вы должны выполнять эту функцию static или даже бесплатную функцию (friend ed, если необходимо). Также вы копируете strings каждый раз, и было бы лучше, если бы вы взяли аргументы по константной ссылке, чтобы избежать ненужных копий.

В случае, если реальный результат предиката зависит от состояния объекта Spellcheck, вам придется привязать это состояние к функции-члену, чтобы создать объект функции с подходящей подписью:

std::binary_search(
    this->words.begin(), this->words.end()
  , std::bind( &Spellcheck::smart_comp, this )
);
2 голосов
/ 04 ноября 2011

Вы пытаетесь передать нестатическую функцию-член, которая не может быть преобразована в требуемую двоичную функцию (из-за наличия трех фактических параметров).

Попробуйте объявить вашу smart_comp функцию static. (Конечно, тогда вы не можете ссылаться на членов экземпляра; если вам нужна структура состояния, вам придется написать полный функтор.)

1 голос
/ 04 ноября 2011

Предполагая, что тип this->words равен std::vector<std::string>, а func является членом Spellcheck, вы можете обойти его, объявив smart_comp равным static. Но я бы дважды подумал о дизайне вашего класса.

...