1

我们可以valarray从一个基本的用户定义数组初始化 a,如下所示:

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

我们怎样才能反过来呢?假设我们有一个valarray<int>并且我们需要转换回一个基本的用户定义数组?我在文档中没有找到任何东西。

4

2 回答 2

3

valarray您不能在不使用动态内存的情况下从 a 创建数组,因为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));
于 2017-12-21T16:15:30.033 回答
2

我们怎样才能反过来呢?

如果您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';
    }
}
于 2017-12-21T16:31:39.373 回答