📜  std :: slice(Valarray切片选择器)

📅  最后修改于: 2021-05-30 05:24:24             🧑  作者: Mango

Valarray切片选择器:此类表示valarray切片选择器。它不包含也没有引用任何元素–它仅描述要用作valarray :: 运算符[]中的索引的元素的选择。

std :: slice是选择器类,用于标识std :: valarray的子集。类型为std :: slice的对象包含三个值:起始索引,步幅和子集中的值总数。类型为std :: slice的对象可以与valarray的运算符[]一起用作索引。

class slice;

简而言之,它用于基于索引进行切片。 valarray切片由起始索引,大小和步幅定义。
句法 :

slice( std::size_t start, std::size_t size, std::size_t stride );
size_t star : is the index of the first element in the selection
size_t size : is the number of elements in the selection
stride : is the span that separates the elements selected.
  • 在给定的语法中,默认情况下,构造函数等效于slice(0,0,0)。存在此构造方法仅是为了构造切片数组。
  • 它使用参数start,size,stride构造一个新切片。该切片将引用元素的大小数,每个元素的位置:
    start + 0*stride
    start + 1*stride
    ....
    ....
    start + (size-1)*stride
    

例子:

slice(1, 5, 4)
Input :  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Output : 1 5 9 13 17 
Explanation : starting from index 1 then next index 1 + 1 * 4 = 5, next index 1 + 2 * 4 = 9, 
              next index 1 + 3 * 4 = 13, next index 1 + 4 * 4 = 17.

因此,步幅大于1的切片不会在valarray中选择连续元素。例如,slice(3,4,5)选择元素3、8、13和18。

// C++ program to test the functioning of std::slice
#include  // std::cout
#include  // std::size_t
#include  // std::valarray, std::slice
  
int main()
{
    std::valarray sample(12);
    // initialising valarray
    for (int i = 0; i < 13; ++i)
        sample[i] = i;
  
    // using slice from start 1 and size 3 and stride 4
    std::valarray bar = sample[std::slice(2, 3, 4)];
  
    // display slice result
    std::cout << "slice(2, 3, 4):";
    for (std::size_t n = 0; n < bar.size(); n++)
        std::cout << ' ' << bar[n];
    std::cout << '\n';
  
    return 0;
}

输出:

slice(2, 3, 4): 2 6 10

应用: slice的一个简单应用是查找矩阵的轨迹。

// C++ program to find trace of a matrix by using std::slice
#include  // std::cout
#include  // std::valarray, std::slice
  
using namespace std;
  
int main()
{
    // row and column of matrix
    int row = 3, col = 3;
  
    // matrix of size row*col in row major form.
    std::valarray matrix(row * col);
  
    // initialising matrix
    for (int i = 0; i < row * col; ++i)
        matrix[i] = i + 1;
  
    // using slice from start 0 with size as col and stride col+1
    std::valarray diagonal = matrix[std::slice(0, col, col + 1)];
  
    // finding trace using diagonal we got using slice
    int index = 0;
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++)
            std::cout << matrix[index++] << " "; // same as matrix[i][j]
        std::cout << endl;
    }
  
    int sum = 0; // initialising sum as 0
    // calculating trace of matrix
    for (int i = 0; i < diagonal.size(); i++)
        sum += diagonal[i];
    std::cout << "Trace of matrix is : ";
    std::cout << sum << endl; // sum is trace of matrix
    return 0;
}

输出:

1 2 3 
4 5 6 
7 8 9 
Trace of matrix is : 15

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”