簡體   English   中英

將 C 數組分配給 C++ 的 std::array? (標准::數組<T,U> = T[U]) - 從 &quot;T [U]&quot; 到 &quot;std::array 不存在合適的構造函數<T,U> ”

[英]Assign C array to C++'s std::array? (std::array<T,U> = T[U]) - no suitable constructor exists from "T [U]" to "std::array<T,U>"

我正在嘗試將 C 數組分配給 C++ std::array。

我該怎么做,最干凈的方式並且不制作不需要的副本等?

做的時候

int X[8];
std::array<int,8> Y = X;

我收到編譯器錯誤:“不存在合適的構造函數”。

沒有從普通數組到std::array轉換,但您可以將元素從一個復制到另一個:

std::copy(std::begin(X), std::end(X), std::begin(Y));

這是一個工作示例:

#include <iostream>
#include <array>
#include <algorithm>  // std::copy

int main() {
    int X[8] = {0,1,2,3,4,5,6,7};
    std::array<int,8> Y;
    std::copy(std::begin(X), std::end(X), std::begin(Y));
    for (int i: Y)
        std::cout << i << " ";
    std::cout << '\n';
    return 0;
}

我知道已經有一段時間了,但也許仍然有用(對某些人)。 上面提供的解決方案很棒,但是也許您會對一個不太優雅但可能更快的解決方案感興趣:

    #include <array>
    #include <string.h>
    
    using namespace std;
 
    double A[4] = {1,2,3,4};
    array<double, 4> B;
    memcpy(B.data(), A, 4*sizeof(double));

數組大小可以在需要時以其他(更動態的)方式確定,這里只是一個想法。 我還沒有測試這兩種解決方案的性能。

這里提出的一個需要提供適當的大小,否則可能會發生不好的事情。

編輯:
下面的評論讓我進行了測試,除非有人真的想最大限度地提高性能,否則這是不值得的(每個循環來回復制測試):
B 大小:100000 個測試副本與 memcpy 在 100000 個元素數組上的 100000 個循環計數:
** 復制()= 9.4986 秒
** memcpy() = 9.45058 秒
B 大小:100000 個測試副本與 memcpy 在 100000 個元素數組上的 100000 個循環計數:
** 復制()= 8.88585 秒
** memcpy() = 9.01923 秒
B 大小:100000 個測試副本與 memcpy 在 100000 個元素數組上的 100000 個循環計數:
** 復制()= 8.64099 秒
** memcpy() = 8.62316 秒
B 大小:100000 個測試副本與 memcpy 在 100000 個元素數組上的 100000 個循環計數:
** 復制()= 8.97016 秒
** memcpy() = 8.76941 秒

C++20 有std::to_array函數

所以,代碼是

int X[8];
std::array<int, 8> Y = std::to_array(X);

https://godbolt.org/z/Efsrvzs7Y

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM