![](/img/trans.png)
[英]Construct a std::map<T,U> from a std::vector<std::pair<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 秒
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.