Можно ли складывать иттератор с size_t?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Пусть есть класс контейнера, а в нём класс иттератора. Допустимо ли перегрузить в классе иттератора оператор сложения с size_t (size_t справа), возвращающий иттератор, указывающий на элемент, отстоящий от текущего на заданное количество шагов, например, в классе иттератора списка перегрузить оператор

Код: Выделить всё

itterator operator +(size_t Right)
{
 itterator Result;
 Result.Pointer=Pointer;
 for (; Right!=0; --Right)
 {
  if (Pointer!=nullptr)
  {
   Result.Pointer=Result.Pointer->Next;
  }
 }
 return Result;
}
?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Допустимо в тех случаях, когда это random access итератор.

Для forward итераторов в большинстве случаев это тоже можно было бы заимплементить, но в STL это не сделано специально, чтобы подчеркнуть линейную, а не константную сложность такой операции.

Если же хочется написать универальный код, то нужно использовать std::advance, который использует специализацию и скрывает от программиста то, делает ли он внутри один раз +, либо вызывает инкремент в цикле.

P.S. Что такое random access и forward итераторы, читай подробней в гугл.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):random access итератор
А это что за "зверь"?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):А это что за "зверь"?
Я же написал вроде:
Romeo писал(а):P.S. Что такое random access и forward итераторы, читай подробней в гугл.
Или тебе ссылку дать?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Дайте. А то гугол это предлагает.
Random Access Memories[комм 1] — четвёртый альбом французского электронного дуэта Daft Punk, выпущенный в мае 2013 года. Пластинка отличается большим количеством совместных треков. В записи альбома приняли участие многие артисты, среди которых Найл Роджерс, Пол Уильямс, Джорджио Мородер, Фаррелл Уильямс, Тодд Эдвардс, DJ Falcon, Gonzales, Panda Bear и Джулиан Касабланкас. Альбом был крайне положительно принят критикой. Он получил премии Грэмми в номинациях «Альбом года», «Лучший электронный/танцевальный альбом» и «Лучший инжиниринг альбома, не классического»[12].
Надеюсь не надо объяснять, что к программированию это не относится?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Картинка по гугл-запросу "daft punk facepalm"

Изображение

А вы не пробовали сузить область поиска, добавив "С++" и "iterator"? Например, так: c++ random access iterator
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Гугол предложил это:
Итераторы произвольного доступа (Random access iterators)

Класс или встроенный тип X удовлетворяет требованиям итераторов произвольного доступа, если к таблице, которая определяет двунаправленные итераторы, мы добавим следующие строки:
Таблица 6: Требования итератора произвольного доступа (в дополнение к двунаправленному итератору) выражение возвращаемый тип семантика исполнения утверждение/примечание состояние до/после
r += n X& { Distance m = n;
if(m >= 0)
while(m--) ++r;
else
while(m++) --r;
return r; }
a + n
n + a X { X tmp = a;
return tmp += n; } a + n == n + a.
r -= n X& return r += -n;
a - n X { X tmp = a;
return tmp -= n; }
b - a Distance до: существует значение n типа Distance такое,
что a + n = b.
b == a + (b - a).
a[n] обратимый в T *(a + n)
a < b обратимый в bool b - a > 0 < - это отношение полного упорядочения
a > b обратимый в bool b < a > - это отношение полного упорядочения, противоположное <.
a >= b обратимый в bool !(a < b)
a <= b обратимый в bool !(a > b)
. Вот только нужен не "ареал", а сам "зверь".
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Вот только нужен не "ареал", а сам "зверь".
А как у вас с математикой, конкретно с алгеброй? Вы способны понять абстрактную концепцию типа "кольцо", "идеал", "поле", "группа", "биекция"?

Random access iterator это любой тип, который удовлетворяет заданной аксиоматике. То есть да, это "ареал", а не зверь. Если нужен конкретный пример - тип int* это Random access iterator. Для него справедливы все перечисленные выше аксиомы. Более сложный пример это std::deque<int>::iterator.
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Там сказано "удовлетворяет требованиям". В ТАР тоже есть объекты, удовлетворяющие условиям применения релейного регулятора. Но как ни перечисляй их свойства, понять, что такое сам регулятор и чем он отличается от цифрового пропорционального регулятора с широтно-модулированным, или скважно-модулированным управляющим воздействием не получится. Зато определение
Релейный регулятор есть регулятор, выбирающий одно из двух дискретных значений управляющего воздействия в зависимости только от знака сигнала рассогласования
даёт такое понимание. Бесполезно говорить, что релейный регулятор примени для регулирования тех объектов, у которых инерционна сама регулируемая величина, но не скорость её изменения. Утюг при выключенном нагревателе не продолжает нагреваться, плавно, сохраняя, или уменьшая скорость нагрева, а начинает остывать в момент выключения, а массивный ротор выключенного двигателя со слабым сопротивлением вращению продолжает вращаться, плавно уменьшая скорость. У утюга регулируемая величина - температура, релейный регулятор применим. С двигателем сложнее. Если регулируемая величина - скорость, то при выключении она быстро начинает уменьшаться, релейный регулятор может быть применим. Но если регулируемая величина - положение приводимого двигателем механизма и весь объект целиком обладает большой инерцией, то он в случае применения релейного регулятора после выключения пройдёт далеко за требуемое место, поэтому релейный регулятор не применим. Проблема в том, что время инерции для скорости вращения много больше, чем для углового ускорения.
А как у вас с математикой, конкретно с алгеброй? Вы способны понять абстрактную концепцию типа "кольцо", "идеал", "поле", "группа", "биекция"?
А каким боком геометрия с полями? Или имеется ввиду физическое, например, электростатическое поле, а кольцо - форма его источника? И при чём здесь группа?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):Дайте. А то гугол это предлагает ... Random Access Memories
Боже мой... и у этого человека патент в области поиска информации... куда мир катится?
Сионист писал(а):А каким боком геометрия с полями? Или имеется ввиду физическое, например, электростатическое поле, а кольцо - форма его источника? И при чём здесь группа?
Нет, ты всё же определённо не умеешь читать. Тебе говорят "алгебра", а ты читаешь "геометрия". А к чему здесь алгребра я тебе и сам могу сказать. Теория множеств - это раздел алгебры. И, похоже, ты её не понимаешь.

P.S. Флуд про роторы, двигатели и утюги пропустил намеренно. Так что если ты в том абзаце упрятал какие-то необычно важные аргументы, оправдывающие глупость твоих предыдущих постов, то извини, я их не прочёл.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Закрыто