|
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
|
||||||
Что-то не так с transform?17.11.2016, 17:19. Показов 2807. Ответов 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,306
|
|||||||
| 17.11.2016, 20:45 | |||||||
|
Об этом и вопрос! Формально выражение *it++ означает *(it++) и в случае перегруженных операторов * и ++ производится сохранение и использование предыдущего значения итератора после того, как получен инкрементированный итератор.С точки зрения буквальной интерпретации этого нельзя делать для итераторов класса input iterator. С такими итераторами формально нельзя делать *it++.Однако в спецификации языка для этих целей сделано специальное замечание, которое добавляет спеициальную трактовку для выражения *it++ в случае input iterator. А именно, такое выражение должно быть экаивалентно
4
|
|||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|||
| 17.11.2016, 20:52 | |||
|
Таким образом исходный код transform корректен, но именно из-за этой специальной обработки выражения *it++ для input iterators. Общая проблема поднятая kozlik_kozlik действительно имеет место и вопрос задан совершенно справедливый. Ответ на этот вопрос: спецификация стандартной библиотеки содержит "костыль", специально предназначенный для того, чтобы такие случаи работали правильно. Добавлено через 1 минуту ++. Постфиксный ++ возвращает старое значение итератора, после чего инкрементирует исходное значение. После этого использовать старое значение уже нельзя. А *it++ посылает это старое значение в оператор *. Отсюда и вопрос.
4
|
|||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|
| 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,306
|
||
| 17.11.2016, 21:15 | ||
|
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||
| 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,306
|
|||||||
| 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,306
|
|||
| 17.11.2016, 22:37 | |||
|
Input iterator предназначен для итерования "однопроходных" входных последовательностей. За таким итератором может скрываться поток ввода с клавиатуры или чтения с накопителя на манитной ленте. После того, как вы прочитали данные, вы уже либо принципиально не можете прочитать их снова (нельзя заставить пользователя напечатать еще раз то, что он печатал ранее), либо это слишко дорого (дорого перематывать магнитную ленту назад), либо вы просто настаиваете на однопроходной природе алгоритма. Размеется, можно предложить хранить считанные данные внутри самого итератора. Тогда будет создаваться иллюзия, как будто через "старые" итераторы можно запросто читать данные. Но это не соответстстует идее итератора. Итератор не должен (не может, не обязан) "кэшировать" читаемые данные внутри себя по многим разным причинам. Добавлено через 9 минут ++ нет никаких намеков на то, в какой момент происходит модификация операнда.Спецификации префиксного и постфиксного говорят, что префиксный ++ возвращает новое значение операнда, а постфиксный ++ возвращает старое значение операнда. И все.А уж как у них там внутри все делается - это не оговаривается. В какой момент постфиксный ++ изменит свой операнд тоже не оговаривается. Главное, чтобы он вернул старое значение.Поэтому ваше предположение, что постфиксный ++ должен "увеличивать итератор после вычисления выражения" совершенно не обосновано. Ничего подобного никогда в спецификации постфиксного ++ не было.
3
|
|||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||
| 17.11.2016, 23:51 | ||
transform "почему-то" об этом не беспокоится и спокойно реализует свою функциональность так, как будто ничего особенного в input iterator нет.
0
|
||
| 17.11.2016, 23:51 | |
|
Что не так с кодом? ( пытаюсь понять, что не так? )
Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее? сегодня так можно сказать праздник так что...
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу)))
Критические ошибки, мешающие компиляции и. . .
|
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата)
Этот документ предназначен для того, чтобы новый чат Claude мог продолжить
работу без необходимости заново разбираться в. . .
|