valarray(); // (1)
explicit valarray(size_t n); // (2)
valarray(const T& value, size_t n); // (3)
valarray(const T* first, size_t n); // (4)
valarray(const ValOrProxy<T>& x); // (5)
valarray(valarray&& x) noexcept; // (6) C++11 から
valarray(const slice_array<T>& x); // (7)
valarray(const gslice_array<T>& x); // (8)
valarray(const mask_array<T>& x); // (9)
valarray(const indirect_array<T>& x); // (10)
valarray(initializer_list<T> init); // (11) C++11 から
valarray
オブジェクトの構築
- (1) : デフォルトコンストラクタ
- (2) :
n
個のT()
初期化された要素を保持したvalarray
オブジェクトを構築する。 - (3) :
value
のコピーをn
個要素として保持したvalarray
オブジェクトを構築する。 - (4) : イテレータ範囲
[first, first + n)
を要素としてコピーしたvalarray
オブジェクトを構築する。 - (5) : コピーコンストラクタ
- (6) : ムーブコンストラクタ
- (7) :
slice_array
オブジェクトからvalarray
への変換を行う。 - (8) :
gslice_array
オブジェクトからvalarray
への変換を行う。 - (9) :
mask_array
オブジェクトからvalarray
への変換を行う。 - (10) :
indirect_array
オブジェクトからvalarray
への変換を行う。 - (11) : 初期化子リストを受け取るコンストラクタ
効果
- (1) :
size() == 0
の要素を持たない空のvalarray
オブジェクトを構築する。 - (2) :
n
個のT()
初期化された要素を保持したvalarray
オブジェクトを構築する。 - (3) :
value
のコピーをn
個要素として保持したvalarray
オブジェクトを構築する。 - (4) : ポインタ
first
が指す要素からn
個先までをコピーして、valarray
オブジェクトを構築する。n
がfirst
の要素数より大きい場合、未定義動作を引き起こす。 - (5) :
x
と同じ要素を保持したvalarray
オブジェクトを構築する。 - (6) :
x
と同じ要素を保持したvalarray
オブジェクトを構築する。ムーブ後のx
の状態は未規定。 - (7), (8), (9), (10) :
x
が参照している要素から、valarray
オブジェクトを構築する。 - (11) :
valarray(init.begin(), init.size())
と等価。
計算量
- (6) : 定数時間
備考
- 引数の型
ValOrProxy
は、valarray
、あるいは、その代理となる型である。
<valarray>
の概要も参照のこと。
例
#include <iostream>
#include <valarray>
template <class T>
void print(const char* name, const std::valarray<T>& va)
{
std::cout << name << " : {";
bool first = true;
for (const T& x : va) {
if (first) {
first = false;
}
else {
std::cout << ',';
}
std::cout << x;
}
std::cout << "}" << std::endl;
}
int main()
{
// (1)
// デフォルト構築
std::valarray<int> va1;
print("va1", va1);
// (2)
// 3個の要素を保持するvalarrayオブジェクトを構築。
// 要素は0(T())で埋められる。
std::valarray<int> va2(3);
print("va2", va2);
// (3)
// 値1を持つ要素3個からなるvalarrayオブジェクトを構築。
std::valarray<int> va3(1, 3);
print("va3", va3);
// (4)
// 配列の先頭3要素のコピーからvalarrayオブジェクトを構築。
int ar4[] = {1, 2, 3, 4};
std::valarray<int> va4(ar4, 3);
print("va4", va4);
// (5)
// コピー構築。
std::valarray<int> va5 = va4;
print("va5", va5);
// (6)
// ムーブ構築。
std::valarray<int> va6 = std::move(va5);
print("va6", va6);
// (7)
// スライスされたvalarrayオブジェクトから構築
std::valarray<int> va7_org = {1, 2, 3, 4, 5};
std::valarray<int> va7(va7_org[std::slice(0, 3, 1)]); // 先頭3要素
print("va7", va7);
// (8)
// 行列スライスされたvalarrayオブジェクトから構築
std::valarray<int> va8_org = {1, 2, 3, 4, 5};
std::valarray<std::size_t> va8_len = {1, 2, 2};
std::valarray<std::size_t> va8_stride = {2, 3, 1};
std::valarray<int> va8 = va8_org[std::gslice(0, va8_len, va8_stride)];
print("va8", va8);
// (9)
// マスクされたvalarrayオブジェクトから構築
std::valarray<int> va9_org = {1, 2, 3, 4, 5};
std::valarray<bool> va9_mask = {true, false, true, false, true};
std::valarray<int> va9 = va9_org[va9_mask];
print("va9", va9);
// (10)
// インデックス列の指定によってマスクされたvalarrayオブジェクトから構築
std::valarray<int> va10_org = {1, 2, 3, 4, 5};
std::valarray<std::size_t> va10_indices = {0, 2, 4};
std::valarray<int> va10 = va10_org[va10_indices];
print("va10", va10);
// (11)
// 初期化子リストから構築
std::valarray<int> va11 = {1, 2, 3};
print("va11", va11);
}
出力
va1 : {}
va2 : {0,0,0}
va3 : {1,1,1}
va4 : {1,2,3}
va5 : {1,2,3}
va6 : {1,2,3}
va7 : {1,2,3}
va8 : {1,2,4,5}
va9 : {1,3,5}
va10 : {1,3,5}
va11 : {1,2,3}
参照
- N2679 Initializer Lists for Standard Containers(Revision 1)
- (11)の経緯となる提案文書