binary_search вектора с обьектами из не стандартной библиотеки

У меня есть следующий код:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <math.h>
#include <set>

using namespace std;

struct IndexedCharacter {
    char c;
    long long int i;
    // Небольшая структура для хранения символа и его порядкового номера
    // который к нему привязан
    IndexedCharacter(char character, long long int index) {
        c = character;
        i = index;
    }
    long long int getIndex() {
        return i;
    }
    char getCharacter() {
        return c;
    }
};

bool operator<(const IndexedCharacter& l, const IndexedCharacter& r) {
    return l.i < r.i;
}

struct IndexedString {
    // Строка, где для каждого символа можно получить индекс, который
    // был присвоен ему при самом начале инициализации строки
    // Так после удаления части символов из строки можно сказать для 
    // оставшихся букв в строке - каков был их первоначальный индекс
    // К примеру:
    //
    // индексы  : 1234567
    // строка   : AGTCTCG
    //
    // после изменений (убраны символы на местах 345):
    // индексы  : 1267
    // строка   : AGCG


    // Вектор символов с привязанным порядковым номером, который был
    // присвоен в начале (привязанный порядковый номер присваивается один раз 
    // и больше не меняется при добавлении\удалении элементов из вектора)
    vector<IndexedCharacter> vec;

    // Используем бинарное дерево поиска для удаления IndexedCharacter
    // который имеет индекс == index
    void popByCharIndex(long long int index) {
        sort(vec.begin(), vec.end());
        if (binary_search(vec.begin(), vec.end(), index)) { // ========== Ошибка =============
            vec.erase(vec.begin() + index);
        }
    }

    // Преобразовать строку в IndexedString
    // (делается один раз в начале)
    void addString(string str) {
        for (int i = 0; i < str.length(); i++) {
            vec.push_back(IndexedCharacter(str[i], i));
        }
    }

    // Добавляет к концу 1й символ входящей строки с
    void addCharacter(string c, long long int index) {
        vec.push_back(IndexedCharacter(c[0], index));
    }

    // Добавляет IndexedCharacter в начало vec
    void addCharacterToBegining(string c, long long int index) {
        // c, index - это элементы для создания IndexedCharacter, который и будет добавляться
        vec.insert(vec.begin(), IndexedCharacter(c[0], index));
    }

    // Получить длину строки
    long long int size() {
        return vec.size();
    }

    // Пустая ли IndexedString
    bool empty() {
        return (size() > 0) ? false : true;
    }

    // Очистить IndexedString
    void clear() {
        vec.clear();
    }

};

bool operator<(const IndexedString& l, const IndexedString& r) {
    return l.vec.size() < r.vec.size();
}

class SameSubstringsSearcher {
public:
    IndexedString s1; // Первая строка
    IndexedString s2; // Вторая строка
    long long int maxlen;
    long long int minlen;
    // Конструктор
    SameSubstringsSearcher(string str1, string str2) {
        // str1 - 1 строка, str2 - 2 строка
        s1.addString(str1);
        s2.addString(str2);
        // Сохраняем длины строк
        long long int s1Size = s1.size();
        long long int s2Size = s2.size();
        if (s1Size == s2Size) {
            maxlen = s1Size;
            minlen = s1Size;
        }
        else if (s1Size > s2Size) {
            maxlen = s1Size;
            minlen = s2Size;
        }
        else {
            maxlen = s2Size;
            minlen = s1Size;
        }
    }

    bool isIndexedCharacterExist(long long int index, IndexedString & AorB) {
        // Если IndexedCharacter с индексом=index существует в текущей IndexedString
        // То возвращает true, иначе false
        sort(AorB.vec.begin(), AorB.vec.end());
        return binary_search(AorB.vec.begin(), AorB.vec.end(), index); // ========== Ошибка =============
    }

};

int main() {

    string s1 = "ATCGATCGTACTCGGTATA";
    string s2 = "AGTACGTATATCTGGAATA";

    SameSubstringsSearcher sss(s1, s2);

    // Существует ли символ с таким индексом?
    cout << sss.isIndexedCharacterExist(1, sss.s1) << "\n";

    return 0;
}

Как видно - есть 2 структуры и класс, который будет заниматься обработкой двух IndexedCharacter. Для функции std::sort для этих структур я указал bool operator< функции. Но у меня возникает ошибка при компиляции в 2 местах, которые я пометил как ========== Ошибка =============. В обоих я использую binary_search, в которых она и возникает:

1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\algorithm(3302): error C2672: 'operator __surrogate_func': no matching overloaded function found
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\algorithm(3309): note: see reference to function template instantiation 'bool std::binary_search<_FwdIt,_Ty,std::less<void>>(_FwdIt,_FwdIt,const _Ty &,_Pr)' being compiled
1>        with
1>        [
1>            _FwdIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<IndexedCharacter>>>,
1>            _Ty=__int64,
1>            _Pr=std::less<void>
1>        ]
1>c:\users\horseman.mini\source\repos\timefunccheck\timefunccheck\timefunccheck.cpp(56): note: see reference to function template instantiation 'bool std::binary_search<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>,__int64>(_FwdIt,_FwdIt,const __int64 &)' being compiled
1>        with
1>        [
1>            _Ty=IndexedCharacter,
1>            _FwdIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<IndexedCharacter>>>
1>        ]
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\algorithm(3302): error C2893: Failed to specialize function template 'unknown-type std::less<void>::operator ()(_Ty1 &&,_Ty2 &&) const'
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\algorithm(3302): note: With the following template arguments:
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\algorithm(3302): note: '_Ty1=const _Ty &'
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\algorithm(3302): note: '_Ty2=IndexedCharacter &'

Что мне исправить чтобы я мог использовать binary_search для вектора с кастомными объектами.

Код сокращен по максимому для репрезентативного вида проблемы, от чего структура IndexedChar и IndexedString кажутся конфузными, не несущими смысла. Я вижу это и заранее прощу не обращать на это вашего внимания


Ответы (0 шт):