Как использовать Comparator?
Есть сортировка. Ее надо переделать так, чтобы она работала с Comparator. Сейчас у меня ошибка:
Ошибка C2664 "bool myclass::operator ()(int,int)": невозможно преобразовать аргумент 1 из "RandomIterator" в "int"
Как это исправить?
struct myclass {
bool operator() (int i, int j) { return (i < j); }
} myobject;
template <class RandomIterator, class Compare>
void sort(RandomIterator begin, RandomIterator end, Compare comp) {
int temp{ 0 };
if (end - begin + 1 > 2) {
temp = (end - begin + 1) / 3;
sort(begin, end - temp, comp);
sort(begin + temp, end, comp);
sort(begin, end - temp, comp);
}
if (comp(end, begin)) {
std::swap(begin, end);
}
}
int main() {
experiment ex;
int n{ 1000 };
std::vector<int> c(n);
sort(c.begin(), c.end(), myclass());
std::cout << "\nd. Sorted data: ";
for (int i = 0; i < n; i++) std::cout << c[i] << ' ';
return 0;
}
Ответы (2 шт):
Автор решения: Harry
→ Ссылка
Смотрите, вы вызываете
comp(end, begin)
компаратор для итераторов, а описываете его как принимающий значения int:
bool operator() (int i, int j) { return (i < j); }
Может, все же
comp(*end, *begin)
нет? Да и swap ниже - что именно вы хотите обменивать? Значения, на которые указывают итераторы, или сами итераторы?
Автор решения: AlexGlebe
→ Ссылка
Напишите сравнитель тоже шаблоном. Аргументы могут быть значениями или итераторами. Привёл два способа :
# include <vector>
# include <iostream>
template <class RandomIterator>
struct myclass {
bool operator() (RandomIterator i, RandomIterator j) {
return ((*i) < (*j)); }
} ;
template <class RandomValue>
struct myclassval {
bool operator() (RandomValue i, RandomValue j) {
return (i < j); }
} ;
template <class RandomIterator, class Compare>
void sort(RandomIterator begin, RandomIterator end, Compare comp) {
int temp{ 0 };
if (end - begin + 1 > 2) {
temp = (end - begin + 1) / 3;
sort(begin, end - temp, comp);
sort(begin + temp, end, comp);
sort(begin, end - temp, comp);
}
if (comp(end, begin)) {
// менять надо значения, а не итераторы
std::swap(*begin, *end);
}
}
template <class RandomIterator, class Compare>
void sortval(RandomIterator begin, RandomIterator end, Compare compval) {
int temp{ 0 };
if (end - begin + 1 > 2) {
temp = (end - begin + 1) / 3;
sortval(begin, end - temp, compval);
sortval(begin + temp, end, compval);
sortval(begin, end - temp, compval);
}
if (compval(*end, *begin)) {
// менять надо значения, а не итераторы
std::swap(*begin, *end);
}
}
int main() {
int n{ 1000 };
std::vector<int> c(n);
sort(c.begin(), c.end(), myclass<std::vector<int>::const_iterator>());
sortval(c.begin(), c.end(), myclassval<int>());
std::cout << "\nd. Sorted data: ";
for (int i = 0; i < n; i++) std::cout << c[i] << ' ';
return 0;
}