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 кажутся конфузными, не несущими смысла. Я вижу это и заранее прощу не обращать на это вашего внимания