На этом шаге мы приведем общие сведения о построении и использовании подмножества элементов.
Оператор индексирования [] перегружается для специальных вспомогательных объектов, различными способами определяющих подмножества элементов. Перегрузка обеспечивает элегантный механизм выполнения операций с частью элементов массива (с доступом как для чтения, так и для записи).
Чтобы определить подмножество массива значений, достаточно указать вместо индекса соответствующее определение, например:
va[std::slice(2,4,3)] // Четыре элемента на расстоянии 3, // начиная с индекса 2 va[va>7] // Все элементы со значением, большим 7
Если определение подмножества (такое, как std::slice(2,4,3) или va>7) используется с константным массивом значений, то выражение возвращает новый массив значений с соответствующими элементами. Но если определение подмножества используется с неконстантным массивом значений, то выражение возвращает временный объект специального вспомогательного класса. Временный объект содержит не данные подмножества, а только его определение. Обработка выражений откладывается до того момента, когда для получения окончательного результата потребуются данные.
Подобный механизм называется отложенным вычислением. Отказ от вычисления временных данных экономит время и память. Кроме того, отложенные вычисления обеспечивают ссылочную семантику, то есть подмножество представляет собой логический набор ссылок на исходные данные. Это позволяет использовать его в качестве приемника команды (l-значения). Например, подмножеству массива значений можно присвоить результат умножения двух других подмножеств того же массива (примеры приводятся вследующих шагах).
С другой стороны, отложенные вычисления могут дать неожиданные результаты в ситуациях, когда элементы приемного множества также присутствуют в исходном множестве. По этой причине любые операции с массивами значений гарантированно работают только в том случае, если исходное и приемное множества не имеют общих элементов.
Хорошо продуманное определение подмножеств позволяет наделить массивы значений семантикой двух и более измерений. Это означает, что массивы значений могут использоваться в качестве многомерных массивов.
Существуют четыре варианта определения подмножеств в массивах значений:
В следующих шагах мы рассмотрим все четыре способа с конкретными примерами.
На следующем шаге мы рассмотрим проблемы с подмножествами элементов массивов значений.