|
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
||||||
Что-то не так с transform?17.11.2016, 17:19. Показов 2827. Ответов 38
Метки нет (Все метки)
transform требует итераторы ввода и делает что-то такое:
*first1++ То есть, смещаемся к следующему элементу контейнера, БЕРЁМ СТАРОЕ ЗНАЧЕНИЕ ИТЕРАТОРА, РАЗЫМЕНОВЫВАЕМ... То же самое слева от присваивания. Но: если значение итератора ввода увеличено на единицу, нет никаких гарантий, что его можно разыменовать по предыдущему значению (с) Прата. Это что же, возможная реализация алгоритма transform с cppreference - неправильная? Или я что-то не так понимаю?
4
|
||||||
| 17.11.2016, 17:19 | |
|
Ответы с готовыми решениями:
38
CSS transform, transition отображаются в Opera не так как в IE В Access был TRANSFORM, а что в MS SQL Server? Unity: Объясните мне, как работает функция transform. Что такое Vector3? |
|
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
||
| 17.11.2016, 20:37 [ТС] | ||
На постинкремент это не распространяется, хорошо. Тогда как он реализован? Приведён, насколько понимаю, псевдокод. Да так, ни о чём. Если надо объяснять, то не надо объяснять.
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,313
|
|||||||
| 17.11.2016, 20:45 | |||||||
|
Об этом и вопрос! Формально выражение *it++ означает *(it++) и в случае перегруженных операторов * и ++ производится сохранение и использование предыдущего значения итератора после того, как получен инкрементированный итератор.С точки зрения буквальной интерпретации этого нельзя делать для итераторов класса input iterator. С такими итераторами формально нельзя делать *it++.Однако в спецификации языка для этих целей сделано специальное замечание, которое добавляет спеициальную трактовку для выражения *it++ в случае input iterator. А именно, такое выражение должно быть экаивалентно
4
|
|||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,313
|
|||
| 17.11.2016, 20:52 | |||
|
Таким образом исходный код transform корректен, но именно из-за этой специальной обработки выражения *it++ для input iterators. Общая проблема поднятая kozlik_kozlik действительно имеет место и вопрос задан совершенно справедливый. Ответ на этот вопрос: спецификация стандартной библиотеки содержит "костыль", специально предназначенный для того, чтобы такие случаи работали правильно. Добавлено через 1 минуту ++. Постфиксный ++ возвращает старое значение итератора, после чего инкрементирует исходное значение. После этого использовать старое значение уже нельзя. А *it++ посылает это старое значение в оператор *. Отсюда и вопрос.
4
|
|||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,313
|
|
| 17.11.2016, 21:05 | |
|
Обратите, кстати, внимание, что спецификация языка разрешает использование только двух типов выражений с постфиксным инкрементом для input iterators:
* (void)r++ - equivalent to (void)++r* *r++ - определено специальным образом (см. выше)То есть на самом деле постфиксный ++ формально бесполезен для input iterators - его результат все равно запрещено использовать. Но ради полезной идиомы *r++ было принято решение внести в спецификацию такой "костыль". Фактически *r++ для input iterators - это атомарная операция со своим индивидуальным определением. Она не распадается на независимые * и ++.Вопрос kozlik_kozlik не просто правильный, а весьма интересный. Я помню, что читал когда-то что-то на эту тему, но мимоходом не до конца понимал, зачем это нужно. А оказывается вот оно что.
1
|
|
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||
| 17.11.2016, 21:10 | ||
![]() Я в принципе так и думал, что последовательность этих 3 операторов как то должна быть обговорена. Сначала подумал про изменение контейнера. Но, тут, как уже сказал TheCalligrapher, об этом сказано явно в стандарте. Если найти причину, почему так сделано, то все станет понятно.
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,313
|
||
| 17.11.2016, 21:15 | ||
|
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,313
|
||
| 17.11.2016, 22:04 | ||
|
(Но к чему это здесь?)
0
|
||
|
|
||||||
| 17.11.2016, 22:08 | ||||||
|
Это я к тому, что вы говорите о "старом" и "новом" значении итератора, хотя этот, уже известный вам кусок кода:
Есть значение итератора, а есть значение на которое он ссылается.
0
|
||||||
|
59 / 54 / 34
Регистрация: 18.04.2014
Сообщений: 122
|
|
| 17.11.2016, 22:12 | |
|
TheCalligrapher, не понимаю почему он сначала инкрементирует, а потом возвращает старое, если постфиксная операция должна увеличивать итератор после вычисления выражения. Я не читал стандарт, но мне казалось что возвращается текущее значение, а затем увеличивается, и таким образом нет возвращения предыдущего значения итератора.
0
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,313
|
|||||||
| 17.11.2016, 22:14 | |||||||
*r++ для input iterator r придано специальное особенное значение, выражаемое вашим куском кода.При этом в общем случае выражение *r++ такой семаники не имеет даже отдаленно. В общем случае такое выражение имеет семантику
*r++ именно и только для input iterators.
0
|
|||||||
|
Комп_Оратор)
|
|||||||
| 17.11.2016, 22:20 | |||||||
|
TheCalligrapher, это удивительно:
0
|
|||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,313
|
|||
| 17.11.2016, 22:37 | |||
|
Input iterator предназначен для итерования "однопроходных" входных последовательностей. За таким итератором может скрываться поток ввода с клавиатуры или чтения с накопителя на манитной ленте. После того, как вы прочитали данные, вы уже либо принципиально не можете прочитать их снова (нельзя заставить пользователя напечатать еще раз то, что он печатал ранее), либо это слишко дорого (дорого перематывать магнитную ленту назад), либо вы просто настаиваете на однопроходной природе алгоритма. Размеется, можно предложить хранить считанные данные внутри самого итератора. Тогда будет создаваться иллюзия, как будто через "старые" итераторы можно запросто читать данные. Но это не соответстстует идее итератора. Итератор не должен (не может, не обязан) "кэшировать" читаемые данные внутри себя по многим разным причинам. Добавлено через 9 минут ++ нет никаких намеков на то, в какой момент происходит модификация операнда.Спецификации префиксного и постфиксного говорят, что префиксный ++ возвращает новое значение операнда, а постфиксный ++ возвращает старое значение операнда. И все.А уж как у них там внутри все делается - это не оговаривается. В какой момент постфиксный ++ изменит свой операнд тоже не оговаривается. Главное, чтобы он вернул старое значение.Поэтому ваше предположение, что постфиксный ++ должен "увеличивать итератор после вычисления выражения" совершенно не обосновано. Ничего подобного никогда в спецификации постфиксного ++ не было.
3
|
|||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,313
|
||
| 17.11.2016, 23:51 | ||
transform "почему-то" об этом не беспокоится и спокойно реализует свою функциональность так, как будто ничего особенного в input iterator нет.
0
|
||
| 17.11.2016, 23:51 | |
|
Что не так с кодом? ( пытаюсь понять, что не так? )
Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее? сегодня так можно сказать праздник так что...
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|