gslice

valarray 的实用程序类,用于定义 valarray 的多维子集。 如果将 valarray 视为具有数组中所有元素的多维矩阵,则 gslice 从多维数组中提取一个向量。

备注

类用于存储确定类型 gslice_array 对象的参数。 当类 gslice 对象显示为类 valarray<Type> 的对象的参数时,将间接构造 valarray 的子集。 存储的值(用于指定从父级 valarray 选择的子集)包括:

  • 一个起始索引。

  • valarray<size_t> 的长度矢量。

  • valarray<size_t> 的跨距矢量。

两个矢量必须具有相同长度。

如果由 gslice 定义的集为常量 valarray 的子集,则 gslice 将是新的 valarray。 如果由 gslice 定义的集为非常量 valarray 的子集,则 gslice 将具有对原始 valarray 的引用语义。 非常量 valarray 对象的评估机制节省了时间和内存。

仅当由 gslice 对象定义的源和目标子集都是不重复的并且所有索引都是有效的,才可以保证对 valarray 对象的操作。

构造函数

构造函数 说明
gslice 定义包含 valarray 的多个切片所有开始的指定元素 valarray 的子集。

成员函数

成员函数 说明
size 查找数组值指定元素个数 valarray 中的泛切片。
start 查找 valarray 的泛切片的起始索引。
stride 查找在 valarray 中的泛切片元素之间的距离。

要求

标头:<valarray>

命名空间: std

gslice::gslice

valarray 的实用程序类,用于定义 valarray 的多维切分。

gslice();

gslice(
    size_t _StartIndex,
    const valarray<size_t>& _LenArray,
    const valarray<size_t>& _IncArray);

参数

_StartIndex
子集中第一个元素的 valarray 索引。

_LenArray
指定每个 gslice 中元素数的 valarray

_IncArray
指定每个 gslice 中跨距的 valarray

返回值

默认构造函数对起始索引存储零,对于长度和跨距向量存储长度为零的向量。 第二个构造函数对于起始索引存储 _StartIndex,对于长度数组存储 _LenArray,对于跨距数组存储 _IncArray

备注

gslice 定义 valarray 的子集,该子集由 valarray 的多个切分组成,每个切分都从相同的指定元素开始。 gsliceslice::slice 之间的唯一差别在于使用数组定义多个切分的能力。 第一个切分具有一个带有 _StartIndex 的索引的第一个元素、由 _LenArray 的第一个元素指定的元素数和由 _IncArray 的第一个元素提供的跨距。 下一个正交切分集具有由第一个切分指定的第一个元素。 _LenArray 的第二个元素指定元素数。 跨距由 _IncArray 的第二个元素指定。 第三个维度的切分会将二维数组的元素视为起始元素,以此类推。

示例

// gslice_ctor.cpp
// compile with: /EHsc
#include <valarray>
#include <iostream>

int main( )
{
   using namespace std;
   int i;

   valarray<int> va ( 20 ), vaResult;
   for ( i = 0 ; i < 20 ; i+=1 )
      va [ i ] =  i;

   cout << "The operand valarray va is:" << endl << "(";
   for ( i = 0 ; i < 20 ; i++ )
      cout << " " << va [ i ];
   cout << " )" << endl;

   valarray<size_t> Len ( 2 ), Stride ( 2 );
   Len [0] = 4;
   Len [1] = 4;
   Stride [0] = 7;
   Stride [1] = 4;

   gslice vaGSlice ( 0, Len, Stride );
   vaResult = va [ vaGSlice ];

   cout << "The valarray for vaGSlice is vaResult:" << endl
        << "va[vaGSlice] = (";

   for ( i = 0 ; i < 8 ; i++ )
      cout << " " << vaResult [ i ];
   cout << ")" << endl;
}
The operand valarray va is:
( 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 )
The valarray for vaGSlice is vaResult:
va[vaGSlice] = ( 0 4 8 12 7 11 15 19)

gslice::size

查找数组值指定元素个数 valarray 中的泛切片。

valarray<size_t> size() const;

返回值

指定 valarray 的泛切分的每个切分中的元素数的 valarray

备注

成员函数将返回切分的存储长度。

示例

// gslice_size.cpp
// compile with: /EHsc
#include <valarray>
#include <iostream>

int main( )
{
   using namespace std;
   int i;
   size_t sizeVA;

   valarray<int> va ( 20 ), vaResult;
   for ( i = 0 ; i < 20 ; i+=1 )
      va [ i ] =  i;

   cout << "The operand valarray va is:\n ( ";
      for ( i = 0 ; i < 20 ; i++ )
         cout << va [ i ] << " ";
   cout << ")." << endl;

   sizeVA = va.size ( );
   cout << "The size of the valarray is: "
        << sizeVA << "." << endl << endl;

   valarray<size_t> Len ( 2 ), Stride ( 2 );
   Len [0] = 4;
   Len [1] = 4;
   Stride [0] = 7;
   Stride [1] = 4;

   gslice vaGSlice ( 0, Len, Stride );
   vaResult = va [ vaGSlice ];
   const valarray <size_t> sizeGS = vaGSlice.size ( );

   cout << "The valarray for vaGSlice is vaResult:"
        << "\n va[vaGSlice] = ( ";
      for ( i = 0 ; i < 8 ; i++ )
         cout << vaResult [ i ] << " ";
   cout << ")." << endl;

   cout << "The size of vaResult is:"
        << "\n vaGSlice.size ( ) = ( ";
      for ( i = 0 ; i < 2 ; i++ )
         cout << sizeGS[ i ] << " ";
   cout << ")." << endl;
}
The operand valarray va is:
( 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ).
The size of the valarray is: 20.

The valarray for vaGSlice is vaResult:
va[vaGSlice] = ( 0 4 8 12 7 11 15 19 ).
The size of vaResult is:
vaGSlice.size ( ) = ( 4 4 ).

gslice::start

查找 valarray 的泛切片的起始索引。

size_t start() const;

返回值

valarray 的泛切分的起始索引。

示例

// gslice_start.cpp
// compile with: /EHsc
#include <valarray>
#include <iostream>

int main( )
{
   using namespace std;
   int i;

   valarray<int> va ( 20 ), vaResult;
   for (i = 0 ; i < 20 ; i+=1 )
      va [ i ] =  i;

   cout << "The operand valarray va is:\n ( ";
      for ( i = 0 ; i < 20 ; i++ )
         cout << va [ i ] << " ";
   cout << ")." << endl;

   valarray<size_t> Len ( 2 ), Stride ( 2 );
   Len [0] = 4;
   Len [1] = 4;
   Stride [0] = 7;
   Stride [1] = 4;

   gslice vaGSlice ( 0, Len, Stride );
   vaResult = va [ vaGSlice ];
   size_t vaGSstart = vaGSlice.start ( );

   cout << "The valarray for vaGSlice is vaResult:"
        << "\n va[vaGSlice] = ( ";
      for (i = 0 ; i < 8 ; i++ )
         cout << vaResult [ i ] << " ";
   cout << ")." << endl;

   cout << "The index of the first element of vaResult is: "
        << vaGSstart << "." << endl;
}
The operand valarray va is:
( 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ).
The valarray for vaGSlice is vaResult:
va[vaGSlice] = ( 0 4 8 12 7 11 15 19 ).
The index of the first element of vaResult is: 0.

gslice::stride

查找在 valarray 中的泛切片元素之间的距离。

valarray<size_t> stride() const;

返回值

指定 valarray 泛切分的每个切分中元素之间距离的 valarray

示例

// gslice_stride.cpp
// compile with: /EHsc
#include <valarray>
#include <iostream>

int main( )
{
   using namespace std;
   int i;

   valarray<int> va ( 20 ), vaResult;
   for (i = 0 ; i < 20 ; i+=1 )
      va [ i ] =  i;

   cout << "The operand valarray va is:\n ( ";
      for (i = 0 ; i < 20 ; i++ )
         cout << va [ i ] << " ";
   cout << ")." << endl;

   valarray<size_t> Len ( 2 ), Stride ( 2 );
   Len [0] = 4;
   Len [1] = 4;
   Stride [0] = 7;
   Stride [1] = 4;

   gslice vaGSlice ( 0, Len, Stride );
   vaResult = va [ vaGSlice ];
   const valarray <size_t> strideGS = vaGSlice.stride ( );

   cout << "The valarray for vaGSlice is vaResult:"
        << "\n va[vaGSlice] = ( ";
      for ( i = 0 ; i < 8 ; i++ )
         cout << vaResult [ i ] << " ";
   cout << ")." << endl;

   cout << "The strides of vaResult are:"
        << "\n vaGSlice.stride ( ) = ( ";
      for ( i = 0 ; i < 2 ; i++ )
         cout << strideGS[ i ] << " ";
   cout << ")." << endl;

}
The operand valarray va is:
( 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ).
The valarray for vaGSlice is vaResult:
va[vaGSlice] = ( 0 4 8 12 7 11 15 19 ).
The strides of vaResult are:
vaGSlice.stride ( ) = ( 7 4 ).

另请参阅

C++ 标准库中的线程安全