1 / 1 / 1
Регистрация: 02.03.2019
Сообщений: 19

Использование std::sort для собственно vector'a

21.11.2019, 17:19. Показов 3456. Ответов 7

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток, необходимо создать рабочий контейнер вектора с итератором, сказано - сделано, хочу проверить его с сортировкой, но тут меня ждали сюрпризы:
1)C2672 "_Sort_unchecked": не найдена соответствующая перегруженная функция algorithm 3466
2)C2893 Сбой при специализации функции-шаблона "void std::_Sort_unchecked(_RanIt,_RanIt,itera tor_traits<_Iter>::difference_type,_Pr) algorithm 3466

Для сортировки нужен перегруженный оператор "-", с горем пополам нашел откуда мне взять difference_type, все сделал, но ошибки никуда не ушли.
Оператор "-":
C++
1
2
3
4
difference_type operator-(MyIterator other) const
{   
    return this->get_index() - other.get_index();
}
Алгоритмы в std работают с итераторами по тегам, добавил тег в публичное поле, ну и using для difference_type:
C++
1
2
using iterator_category = std::random_access_iterator_tag;
using difference_type = std::ptrdiff_t;
Функции begin() и end():
C++
1
2
3
4
5
6
7
8
9
10
MyIterator begin()
{
    MyVector<type>::MyIterator it(&m_main_mas[0], m_main_mas, 0);
    return it;//first
}
MyIterator end()
{
    MyVector<type>::MyIterator it(&m_main_mas[m_elements_number], m_main_mas, m_elements_number);
    return it;//next from last
}
К слову, я попробовал использовать
C++
1
std::find(check.begin(), check.end(), value)
и это увенчалось успехом, значит проблема либо в операторе "-", либо в 4 аргументе функции _Sort_unchecked, то есть в предикате.
заголовок функции:
C++
1
2
template <class _RanIt, class _Pr>
void _Sort_unchecked(_RanIt _First, _RanIt _Last, _Iter_diff_t<_RanIt> _Ideal, _Pr _Pred)
Собственно четкий вопрос, что должен возращать оператор "-", разницу между индексами или значениями?
Нечеткий вопрос, в чем может быть проблема и как её возможно решить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.11.2019, 17:19
Ответы с готовыми решениями:

Использование std::sort() для сортировки числового массива
Выбивает ошибка что sort перегружены #include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace std; int main() { int n,...

Сортировка vectora обьектов функцией sort из algorithm
помогите написать предикат CompareStudent к функции sort нужно чтобы вначале сортировало по Курсу, потом по Фамилии и Имени есть...

Инициализация std vectora
Добрый вечер, как в VS 2008 студии (нету с++ 11) &quot;красиво&quot; проинициализировать вектор векторов не используя массив? вариант с...

7
6771 / 4565 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.11.2019, 17:23
Цитата Сообщение от YmnIchkA Посмотреть сообщение
Собственно четкий вопрос, что должен возращать оператор "-", разницу между индексами или значениями?
Нечеткий вопрос, в чем может быть проблема и как её возможно решить?
Надо возвращать итератор
C++
1
2
3
4
MyIterator operator-(MyIterator other) const
{   
    return MyIterator(this->get_index() - other.get_index());
}
И кстати, для массива лучше чтоб итератор работал не с индексами, а с указателями
0
1 / 1 / 1
Регистрация: 02.03.2019
Сообщений: 19
21.11.2019, 17:38  [ТС]
У меня в классе итератора объявлены указатели на массив и на текущий элемент(на который смотрит итератор), исправил на что-то подобное:
C++
1
2
3
4
5
MyIterator operator-(MyIterator other) const
{
    unsigned int new_index = this->get_index() - other.get_index();
    return MyIterator(main_mas + new_index, main_mas, new_index);
}
Да-да, такой уж конструктор написал. Индекс мне нужен исключительно для смещения по массиву.
К проблеме, оно все равно не хочет работать, ошибки всё те же. Догадался полезть в исходники vector (наконец-то светлая мысль), там вижу следующее:
C++
1
2
3
4
_NODISCARD difference_type operator-(const _Vector_const_iterator& _Right) const {
    _Compat(_Right);
    return _Ptr - _Right._Ptr;
}
Перед функцией define на warning, возвращается всё-таки difference_type, причём в виде разницы между указателями на значения(будет ли это равно разности индексов?)
0
6771 / 4565 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.11.2019, 17:42
Цитата Сообщение от YmnIchkA Посмотреть сообщение
У меня в классе итератора объявлены указатели на массив и на текущий элемент(на который смотрит итератор), исправил на что-то подобное:
Покажи свой класс итератора

Добавлено через 44 секунды
И как ты объявляешь массив и вызываешь std::sort
0
1 / 1 / 1
Регистрация: 02.03.2019
Сообщений: 19
21.11.2019, 17:48  [ТС]
Итератор(template<type> у меня для всего вектора, итератор внутри него оъявлен):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
class MyIterator {
public: 
    using difference_type = std::ptrdiff_t;
    using iterator_category = std::random_access_iterator_tag;
private:
    type *current_value;
    type *main_mas;
    unsigned int index;
public:
    MyIterator()
    {
        index = 0;
        current_value = NULL;
        main_mas = NULL;
    }
    MyIterator(type* init_value, type* mas, unsigned int init_index)
    {
        main_mas = mas;
        current_value = init_value;
        index = init_index;
    }
    MyIterator& operator++()
    {
        index++;
        current_value = main_mas + index;
        return *this;
    }
    MyIterator operator++(int)
    {
        MyIterator tmp = *this;
        index++;
        current_value = main_mas + index;
        return tmp;
    }
    MyIterator& operator--()
    {
        index--;
        current_value = main_mas + index;
        return *this;
    }
    MyIterator operator--(int)
    {
        MyIterator tmp = *this;
        index--;
        current_value = main_mas + index;
        return tmp;
    }
    MyIterator& operator+=(unsigned int value)
    {
        index += value;
        current_value = main_mas + index;
        return *this;
    }
    MyIterator& operator+(unsigned int value)
    {
        index += value;
        current_value = main_mas + index;
        return *this;
    }
    MyIterator& operator-=(unsigned int value)
    {
        index -= value;
        current_value = main_mas + index;
        return *this;
    }
    MyIterator& operator-(unsigned int value)
    {
        index -= value;
        current_value = main_mas + index;
        return *this;
    }
    /*difference_type operator-(MyIterator other) const
    {   
        return this->get_index() - other.get_index();
    }*/
    MyIterator operator-(MyIterator other) const
    {
        unsigned int new_index = this->get_index() - other.get_index();
        return MyIterator(main_mas + new_index, main_mas, new_index);
    }
    type& operator*()
    {
        return *current_value;
    }
    bool operator==(const MyIterator& other) const
    {
        if (current_value == other.current_value)
        {
            if(index == other.index)
                return false;
        }
        return true;
    }
    bool operator!=(const MyIterator & other) const 
    {
        if (current_value != other.current_value)
        {
            if(index != other.index)
                return true;
        }
        return false;
    }
    unsigned int get_index() const
    {
        return index;
    }
    ~MyIterator()
    {
        main_mas = NULL;
        current_value = NULL;
    }
};
объявление массива (если правильно понял):
C++
1
2
3
4
5
MyVector<int> check;
check.push_back(5);
check.push_back(10);
check.push_back(4);
check.push_back(7);
вызов sort:
C++
1
std::sort(check.begin(), check.end());
0
6771 / 4565 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.11.2019, 18:08
Цитата Сообщение от YmnIchkA Посмотреть сообщение
Итератор:
Вот такое условие не срабатывает
C++
1
2
3
4
5
6
7
8
template<class _Iter>
    struct _Iterator_traits_base<_Iter, void_t<
        typename _Iter::iterator_category,
        typename _Iter::value_type,
        typename _Iter::difference_type,
        typename _Iter::pointer,
        typename _Iter::reference
        >>
Добавлено через 15 секунд
Добавь там
C++
1
2
3
4
5
    using value_type = type;
    using reference = value_type &;
    using pointer = value_type *;
    using difference_type = std::ptrdiff_t;
    using iterator_category = std::random_access_iterator_tag;
Добавлено через 5 минут
И там уже исправляй операторы, по аналогии std::vector::iterator
0
1 / 1 / 1
Регистрация: 02.03.2019
Сообщений: 19
21.11.2019, 18:30  [ТС]
вылезла такая ошибка:
C2678 бинарный "<": не найден оператор, принимающий левый операнд типа "_RanIt" (или приемлемое преобразование отсутствует)
перегрузил оператор:
C++
1
2
3
4
bool operator<(MyIterator _Right) const
{
    return this->current_value < _Right.current_value || (this->current_value == _Right.current_value && this->get_index() <  _Right.get_index());
}
И ЭТО ЗАРАБОТАЛО! Спасибо огромное, если не затруднит, объясните каким образом такое условие проверяется? sort просто ищёт в полях такие using?
оператор "-" перегружается так:
C++
1
2
3
4
/*std::_Iter_diff_t<MyIterator>*/difference_type operator-(MyIterator other) const
{   
    return this->current_value - other.current_value;
}
комментарий можно убрать и это тоже будет работать(закомментировать difference_type )
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12900 / 6760 / 1815
Регистрация: 18.10.2014
Сообщений: 17,094
21.11.2019, 18:49
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Надо возвращать итератор
Что за белиберда? Какой еще "итератор"? Оператор вычитания для двух итераторов должен возвращать целочисленное значение типа difference_type, как совершенно правильно сделал TC.

Добавлено через 4 минуты
Цитата Сообщение от YmnIchkA Посмотреть сообщение
C++
1
2
    type *current_value;
    unsigned int index;
Непонятно, зачем вы в своем итераторе поддерживаете две однозначно и тривиально определяющие друг друга переменные.

Если вы оставите только type *current_value;, то вам не понадобится ни unsigned int index;, ни type *main_mas; Фактически весь ваш класс итератора "не нужен": он имеет смысл только в качестве упражнения и для отладки. Его можно заменить на голый указатель, который, как известно, тоже является итератором.

Цитата Сообщение от YmnIchkA Посмотреть сообщение
C++
1
bool operator==(const MyIterator& other) const
Непонятно, почему в эти операторы вы передаете аргумент по const MyIterator&, а в operator- - по значению.

Также, вы зачем написали совершенно не нужный деструктор для своего класса. Это не ошибка сейчас, но в будущем это будет приводить к тому, что в классе будет подавляться генерация конструктора копирования и оператора присваивания. Ваш код перестанет работать. Либо не объявляйте ненужных деструкторов, либо уж объявляйте все по Правилу Трех.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.11.2019, 18:49
Помогаю со студенческими работами здесь

Итератор для std::sort
template&lt;typename T&gt; struct iterator { iterator() :value(nullptr) {} iterator(T*value) :value(value) {} iterator&lt;T&gt;&amp;...

Отличие std::sort От std::qsort
Пишу доклад по программированию, собственно выбрал тему сортировок. вот сейчас хочу расписать отлчиие + и - двух сортировок. но инфу...

std::sort + std::lower_bound
тема такая: есть класс person: class Person{ private: string name_; string adress_; long phone_; есть вектор объектов...

std::sort()
Доброго времени суток! Есть некая структура: struct member { int latency; std::vector&lt;int&gt;child; };

std::sort
Достоинства и недостатки делаю таблицу, достоинств и недостатков std::Sort. собственно, не нащёл нечего про это в википедии


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru