将valarray转换为基本阵列

Convert valarray to basic array

本文关键字:阵列 valarray 转换      更新时间:2023-10-16

我们可以从基本用户定义的数组初始化valarray如下:

int arr[3]={0};
valarray<int> test(arr, sizeof(arr)/sizeof(int));

我们如何以另一种方式移动?假设我们有一个valarray<int>,我们需要转换回基本的用户定义的数组?我没有在文档中找到任何东西。

您不能在不使用动态内存的情况下从valarray创建数组,因为valarray对象的大小在编译时不知道。

std::valarray<int> test{10, 20};
int arr[test.size()];  // Not standard C++. Some compilers support this
                       // as an extension.
// This is how you can get a dynamic array from a valarray.
int* arr = new int[test.size()];
std::copy(begin(test), end(test), arr);

最好使用std::vector<int>,而不是尝试在应用程序代码中管理动态分配的内存。

std::vector<int> arr(begin(test), end(test));

我们如何以另一种方式移动?

如果您知道valarray在编译时的大小,则可以准备int[3]并将值复制到单个元素,例如使用std::copy

#include <valarray>
#include <algorithm>
#include <iostream>
int main()
{
    std::valarray<int> va { 1, 2, 3 };
    int arr[3] = { 0 };
    std::copy(begin(va), end(va), arr);
    std::cout << arr[0] << 'n';
    std::cout << arr[1] << 'n';
    std::cout << arr[2] << 'n';
}

您甚至可以立即使用正确值初始化数组:

#include <valarray>
#include <iostream>
int main()
{
    std::valarray<int> va { 1, 2, 3 };
    int arr[] = { va[0], va[1], va[2] };
    std::cout << arr[0] << 'n';
    std::cout << arr[1] << 'n';
    std::cout << arr[2] << 'n';
}

如果在编译时不知道大小,请改用std::vector

#include <valarray>
#include <vector>
#include <iostream>
int main()
{
    std::valarray<int> va { 1, 2, 3 };
    std::vector<int> v(begin(va), end(va));
    for (auto const& element : v)
    {
      std::cout << element << 'n';
    }
}

只要Valarray的大小不变,您就可以将第一个元素的地址用作基本数组的开始。

#include <valarray>
#include <iostream>
int main() {
  int a[] = {1, 2, 3};
  std::valarray va(a, 3);
  std::cout << a[0] << ',' << a[1] << ',' << a[2] << 'n';
  std::cout << va[0] << ',' << va[1] << ',' << va[2] << 'n';
  int *b = &va[0];
  std::cout << b[0] << ',' << b[1] << ',' << b[2] << 'n';
}