Почему станд.:: for_each операция последовательности неизменения?

Попробуйте:

var checkbox = document.getElementById('check');

if (checkbox.checked == true) {
  //do nothing
} else {
  checkbox.style.display = 'none';
}
<input type="checkbox" id="check" checked>

10
задан Luc Touraille 19 March 2009 в 16:07
поделиться

4 ответа

См. этот дефектный отчет, который они говорят

LWG полагает, что ничто в стандарте не запрещает функциональные объекты, которые изменяют элементы последовательности. Проблема состоит в том, что for_each находится в secion, наделенном правом, "не видоизменяя алгоритмы", и заголовок может сбивать с толку. Ненормативное примечание должно разъяснить это.

Но также и отметьте этого.

Они, кажется, называют это "неизменением", потому что сам for_each не делает exlicitly, изменяют элементы последовательности.

16
ответ дан 3 December 2019 в 13:37
поделиться

Я думаю, "Не изменяя операции последовательности", означают, что эта операция не изменяет последовательность. Но операция могла изменить контейнерные элементы.

Значение контейнерных элементов и последовательности - разные вещи.

6
ответ дан 3 December 2019 в 13:37
поделиться

Вполне просто Вы не можете внести изменение, которое могло изменить структуру контейнера. Поэтому в общем случае, изменяя контейнер может делать недействительным используемые итераторы.

Можно изменить элемент, пока он не изменяет структуру контейнера (такую как порядок элементов в контейнере).

[дополнение]


Обратите внимание, что, кажется, существует некоторый беспорядок о for_each будучи алгоритмом 'неизменения'. Этой запутывающей ситуации подводит итог здесь Stroustrup в опечатках для 4 Печати "Языка Программирования на C++, 3-й Ed". (CPL) говорит следующее о ли for_each может изменить элементы последовательности (http://www.research.att.com/~bs/3rd_printing5.html):

" for_each() алгоритм классифицирован как неизменение, потому что это явно не изменяет последовательность. Однако, если относится последовательность неконстанты for_each() может изменить элементы последовательности. Для примера посмотрите использование negate() в 11,9". (недавнее разрешение стандартов).

CPL первоначально указал, что функциональный или функциональный объект передал for_each не был разрешен изменить элемент, переданный ему. Однако CPL был записан и первоначально опубликован, прежде чем стандарт был завершен, и по-видимому это ограничение на for_each() был удален, прежде чем это было завершено.

См. также:

20
ответ дан 3 December 2019 в 13:37
поделиться

Как litb обозначенный выше, for_each классифицирован как 'не видоизменяющийся алгоритм'

Дубликат 'видоизменения' STL к этому является станд.:: преобразовать.

Так как Вы указали, что знаете, что можно использовать станд.:: преобразуйте, вышеупомянутое действительно становится точкой. Это служит точкой коммуникации людям, которые прочитали Ваш код.

Если я вижу станд.:: for_each, ясно, что независимо от того, что нечто делает, это не изменит контейнер.

Инструкция, за которой я следую, может быть указана:

"Если Вы хотите использовать элементы контейнера, чтобы сделать некоторую задачу, которая не изменяет элементы, использует станд.:: for_each.

Если Вы хотите использовать элементы контейнера, чтобы изменить элементы некоторым системным способом или использовать их в задаче, которая изменит их некоторым способом, использовать станд.:: преобразовать."

2
ответ дан 3 December 2019 в 13:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: