std::slice
Определён в заголовочном файле <valarray> | ||
|---|---|---|
class slice; |
std::slice — это класс-селектор, определяющий подмножество std::valarray, подобное срезу BLAS. Объект типа std::slice хранит три значения: начальный индекс, шаг и общее количество значений в подмножестве. Объекты типа std::slice можно использовать в качестве индексов с помощью operator[] valarray.
Функции-члены
| создаёт срез (функция-член открытого доступа) |
|
| возвращает параметры среза (функция-член открытого доступа) |
std::slice::slice
slice() | (1) | |
slice( std::size_t start, std::size_t size, std::size_t stride ); | (2) | |
slice( const slice& other ); | (3) |
Создаёт новый срез.
slice(0, 0, 0). Этот конструктор существует только для возможности создания массивов срезов.start, size, stride. Этот срез будет ссылаться на size элементов, каждый из которых находится в позиции:other.Параметры
| start | - | позиция первого элемента |
| size | - | количество элементов в срезе |
| stride | - | количество позиций между последовательными элементами среза |
| other | - | другой срез для копирования |
std::slice::start, size, stride
std::size_t start() const; | (1) | |
std::size_t size() const; | (2) | |
std::size_t stride() const; | (3) |
Возвращает параметры, переданные срезу при создании: начальную позицию, размер и шаг соответственно.
Параметры
(нет)
Возвращаемое значение
Параметры среза: начальная позиция, размер и шаг соответственно.
Сложность
Постоянная.
Функции, не являющиеся членами
|
(C++20) | проверяет, равны ли два среза (функция) |
operator==(std::slice)
friend bool operator==( const slice& lhs, const slice& rhs ); | (начиная с C++20) |
Проверяет, равны ли параметры lhs и rhs — начальная позиция, размер и шаг соответственно.
Эта функция не видна при обычном неквалифицированном поиске или квалифицированном поиске и может быть найдена только с помощью поиска с учётом аргументов, если std::slice является ассоциированным классом аргументов.
Оператор != синтезируется из operator==.
Параметры
| lhs, rhs | - | срезы для сравнения |
Возвращаемое значение
lhs.start() == rhs.start() && lhs.size() == rhs.size() && lhs.stride() == rhs.stride()
Пример
Простейший класс Matrix на основе valarray с функцией вычисления следа.
#include <iostream>
#include <valarray>
class Matrix
{
std::valarray<int> data;
int dim;
public:
Matrix(int r, int c) : data(r*c), dim(c) {}
int& operator()(int r, int c) { return data[r * dim + c]; }
int trace() const { return data[std::slice(0, dim, dim + 1)].sum(); }
};
int main()
{
Matrix m(3, 3);
int n = 0;
for (int r = 0; r < 3; ++r)
for (int c = 0; c < 3; ++c)
m(r, c) = ++n;
std::cout << "Trace of the matrix (1,2,3) (4,5,6) (7,8,9) is " << m.trace() << '\n';
}
Вывод:
Trace of the matrix (1,2,3) (4,5,6) (7,8,9) is 15
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 543 | C++98 | было неясно, можно ли использовать срез, созданный конструктором по умолчанию | его можно использовать (как пустое подмножество) |
См. также
| получает или задаёт элемент valarray, срез или маску (функция-член открытого доступа) |
|
| обобщённый срез valarray: начальный индекс, набор размеров, набор шагов (класс) |
|
| прокси для подмножества valarray после применения среза (шаблон класса) |
|
|
(C++23) | невладеющее представление многомерного массива (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/valarray/slice