std::slice
Определено в заголовке <valarray> | ||
|---|---|---|
class slice; |
std::slice — это класс-селектор, который идентифицирует подмножество std::valarray, подобный срезу BLAS. Объект типа std::slice хранит три значения: начальный индекс, шаг и общее количество элементов в подмножестве. Объекты типа std::slice могут использоваться в качестве индексов с оператором valarray[].
Члены
| (конструктор) | создаёт срез (открытый член-функция) |
| startsizestride | возвращает параметры среза (открытый член-функция) |
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) |
Возвращает параметры, переданные срезу при создании — start, size и stride соответственно.
Параметры
(нет)
Возвращаемое значение
Параметры среза — start, size и stride соответственно.
Сложность
Постоянная.
Внешние функции
| operator==(std::slice)
(C++20) | проверяет, равны ли два среза (функция) |
operator==(std::slice)
friend bool operator==( const slice& lhs, const slice& rhs ); | (с C++20) |
Проверяет, равны ли параметры lhs и rhs — start, size и stride соответственно.
Эта функция невидима для обычного неквалифицированного или квалифицированного поиска и может быть найдена только с помощью поиска, зависящего от аргументов, когда 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 после применения среза (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/numeric/valarray/slice