Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для moskitos80
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359

Sort и lvalue

30.03.2017, 17:49. Показов 1045. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Люди подскажите пожалуйста, вот пытаюсь разобраться как написать свой итератор произвольного доступа и столкнулся с шибкой:


In file included from /usr/include/c++/4.9/algorithm:62:0,
from /home/komarov/ClionProjects/learncpp/main.cpp:2:
/usr/include/c++/4.9/bits/stl_algo.h: In instantiation of ‘void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = MyIter<int, 16>; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’:
/usr/include/c++/4.9/bits/stl_algo.h:1884:70: required from ‘void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = MyIter<int, 16>; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’
/usr/include/c++/4.9/bits/stl_algo.h:1970:55: required from ‘void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = MyIter<int, 16>; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’
/usr/include/c++/4.9/bits/stl_algo.h:4685:72: required from ‘void std::sort(_RAIter, _RAIter) [with _RAIter = MyIter<int, 16>]’
/home/komarov/ClionProjects/learncpp/main.cpp:98:31: required from here
/usr/include/c++/4.9/bits/stl_algo.h:1851:17: error: lvalue required as left operand of assignment
*__first = _GLIBCXX_MOVE(__val);


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
#include <iterator>
#include <algorithm>
 
using namespace std;
 
template<class T, int S>
class MyIter: public std::iterator<std::forward_iterator_tag, T>
{
public:
 
    explicit MyIter(T * arr): _arr{arr} {}
 
    MyIter(const MyIter& rhs):
            _arr{rhs._arr} {}
 
    const MyIter<T, S>& operator = (const MyIter& rhs)
    {
        if(this != &rhs) {_arr = rhs._arr;}
        return *this;
    };
 
    MyIter(MyIter&& rhs):
            _arr{std::move(rhs._arr)} {}
 
    const MyIter<T, S>& operator = (MyIter&& rhs)
    {
        if(this != &rhs) {_arr = rhs._arr;}
        return *this;
    };
 
    typename MyIter::value_type operator * ()
    { return *(_arr); }
 
    T & operator-- ()
    { return *(_arr--); }
 
    bool operator == (MyIter<T, S>& rhs)
    { return rhs._arr == _arr; }
 
    bool operator != (MyIter<T, S>& rhs)
    { return rhs._arr != _arr; }
 
    T & operator++ ()
    { return *(_arr++); }
 
    MyIter<T, S>& operator += (int n)
    {
        _arr += n;
        return *this;
    }
 
    MyIter<T, S>& operator -= (int n)
    {
        _arr -= n;
        return *this;
    }
 
    MyIter<T, S> operator + (int n)
    { return MyIter<T, S>{_arr + n}; }
 
    MyIter<T, S> operator - (int n)
    { return MyIter<T, S>{_arr - n}; }
 
    typename MyIter::difference_type operator - (const MyIter<T, S>& rhs)
    { return _arr - rhs._arr; }
 
    typename MyIter::value_type operator [] (int n)
    { return _arr[n]; }
 
    bool operator < (const MyIter<T, S>& rhs)
    { return _arr < rhs._arr; }
 
    bool operator <= (const MyIter<T, S>& rhs)
    { return !(*this < rhs); }
 
    bool operator > (const MyIter<T, S>& rhs)
    { return _arr > rhs._arr; }
 
    bool operator >= (const MyIter<T, S>& rhs)
    { return !(*this > rhs); }
 
private:
    T * _arr;
};
 
int main(int argc, char* argv[])
{
    int array[16] = {0};
 
    array[0] = 0;
    array[1] = 11;
    array[2] = 22;
    array[3] = 33;
 
    auto beginRef = MyIter<int, 16>{array};
    auto endRef   = MyIter<int, 16>{array + 16};
 
    std::sort(beginRef, endRef); // ВОТ ЗДЕСЬ ***
 
// ...
 
    return 0;
}
Я не понимаю в той строке beginRef и endRef и так являются lvalue - чего ему ещё надо?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.03.2017, 17:49
Ответы с готовыми решениями:

Ошибка 500 в менеджере модулей Joomla - Out of sort memory, consider increasing server sort buffer size
Привет! Подскажите что делать , когда такая проблема ?

Sort(), третий параметр: как sort() выбирает аргументы из переданной последовательности для переданной функции?
Вот sotr() 2 параметра - итераторы, а третий функцию. Допустим, моя функция сортирует список по возрастанию сумм цифр числа. Как sort()...

Lvalue и rvalue
Какая выгода использования rvalue? Допустим есть такой класс class A { public: A() = default; void setName(const...

2
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
30.03.2017, 19:06
Цитата Сообщение от moskitos80 Посмотреть сообщение
чего ему ещё надо?
для начала нужно локализовать проблему:
C++
1
2
3
//std::sort(beginRef, endRef);
// ВОТ ЗДЕСЬ ***
*beginRef = 42;
Генерирует подобную ошибку
Bash
1
2
3
4
5
clang++ -Wall -std=c++14 iter.cpp
iter.cpp:100:15: error: expression is not assignable
    *beginRef = 42;
    ~~~~~~~~~ ^
1 error generated.
Следовательно, проблема в разыменовании итератора.
Смотрим на MyIter::operator*()
C++
1
2
typename MyIter::value_type operator * ()
    { return *(_arr); }
Ага. он возвращает копию, а не ссылку
Фиксим:
C++
1
2
typename MyIter::reference operator * ()
    { return *(_arr); }
Bash
1
2
3
4
5
clang++ -Wall -std=c++14 iter.cpp
iter.cpp:97:10: warning: unused variable 'endRef' [-Wunused-variable]
    auto endRef   = MyIter<int, 16>{array + 16};
         ^
1 warning generated.
так же требуется фикс operator ++ () / operator -- ()
C++
1
2
3
4
5
6
7
8
9
10
MyIter<T, S>& operator-- () // ВОТ ЗДЕСЬ ***
    {
        --_arr;
        return *this; }
 
    MyIter<T, S>& operator++ () // ВОТ ЗДЕСЬ ***
    {
        ++_arr;
        return *this;
    }
Окончательный вариант
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
#include <iterator>
#include <algorithm>
 
using namespace std;
 
template<class T, int S>
class MyIter: public std::iterator<std::forward_iterator_tag, T>
{
public:
 
    explicit MyIter(T * arr): _arr{arr} {}
 
    MyIter(const MyIter& rhs):
            _arr{rhs._arr} {}
 
    const MyIter<T, S>& operator = (const MyIter& rhs)
    {
        if(this != &rhs) {_arr = rhs._arr;}
        return *this;
    };
 
    MyIter(MyIter&& rhs):
            _arr{std::move(rhs._arr)} {}
 
    //const
    MyIter<T, S>& operator = (MyIter&& rhs)
    {
        if(this != &rhs) {_arr = rhs._arr;}
        return *this;
    };
 
    typename MyIter::reference operator * () // ВОТ ЗДЕСЬ ***
    { return *(_arr); }
 
    MyIter<T, S>& operator-- () // ВОТ ЗДЕСЬ ***
    {
        --_arr;
        return *this; }
 
    bool operator == (MyIter<T, S>& rhs)
    { return rhs._arr == _arr; }
 
    bool operator != (MyIter<T, S>& rhs)
    { return rhs._arr != _arr; }
 
    MyIter<T, S>& operator++ () // ВОТ ЗДЕСЬ ***
    {
        ++_arr;
        return *this;
    }
 
    MyIter<T, S>& operator += (int n)
    {
        _arr += n;
        return *this;
    }
 
    MyIter<T, S>& operator -= (int n)
    {
        _arr -= n;
        return *this;
    }
 
    MyIter<T, S> operator + (int n)
    { return MyIter<T, S>{_arr + n}; }
 
    MyIter<T, S> operator - (int n)
    { return MyIter<T, S>{_arr - n}; }
 
    typename MyIter::difference_type operator - (const MyIter<T, S>& rhs)
    { return _arr - rhs._arr; }
 
    typename MyIter::value_type operator [] (int n)
    { return _arr[n]; }
 
    bool operator < (const MyIter<T, S>& rhs)
    { return _arr < rhs._arr; }
 
    bool operator <= (const MyIter<T, S>& rhs)
    { return !(*this < rhs); }
 
    bool operator > (const MyIter<T, S>& rhs)
    { return _arr > rhs._arr; }
 
    bool operator >= (const MyIter<T, S>& rhs)
    { return !(*this > rhs); }
 
private:
    T * _arr;
};
 
int main(int argc, char* argv[])
{
    int array[16] = {0};
 
    array[0] = 0;
    array[1] = 11;
    array[2] = 22;
    array[3] = 33;
 
    auto beginRef = MyIter<int, 16>{array};
    auto endRef   = MyIter<int, 16>{array + 16};
 
    std::sort(beginRef, endRef);
    //*beginRef = 42; // ВОТ ЗДЕСЬ ***
 
// ...
 
    return 0;
}
1
 Аватар для moskitos80
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
30.03.2017, 20:08  [ТС]
Спасибо огромное! Как говорится разложили "по полочкам". Мне из-за недостаточного опыта еще пока трудно держать в голове так много нюансов, но я стараюсь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.03.2017, 20:08
Помогаю со студенческими работами здесь

Lvalue required
char Info ; if ((! DdeClientConv1-&gt;SetLink(ComboBox1-&gt;Text, ComboBox2-&gt;Text)) || ! DdeClientConv1-&gt;OpenLink()) ...

Значения Lvalue и Rvalue
Здравствуйте. В данной ссылке https://msdn.microsoft.com/ru-ru/library/f90831hc.aspx приведен пример int main() { int...

Rvalue и lvalue ссылки
Здравствуйте, что расскажите, пожалуйста что такое lvalue и rvalue ссылки и с чем их едят, где можно использовать, и чем отличается...

Expression must be a modifiable lvalue
Добрый день, прошу помощи. При компиляции ругается на (18): error C2276: '&amp;' : illegal operation on bound member function expression ...

Ошибка Lvalue required
Пожалуйста помогите исправить ошибку Lvalue required в этой строке: str2=+(s); #include &lt;iostream&gt; #include &lt;cstring&gt;...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru