C 어레이를 C++의 std:: 어레이에 할당하시겠습니까?(std::array = T[U]) - "T [U]"에서 "std::array" 까지 적합한 생성자가 없습니다 .
C 배열을 C++ std:: 배열에 할당하려고 합니다.
어떻게 하면 가장 깨끗한 방법으로 불필요한 복사본을 만들지 않고 가장 깨끗한 방법은 무엇입니까?
할 때
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;
}
C++20에는 std::to_array 함수가 있습니다.
그래서 코드는.
int X[8];
std::array<int, 8> Y = std::to_array(X);
https://godbolt.org/z/Efsrvzs7Y
시간이 꽤 흘렀지만, 여전히 (누군가에게) 유용할 수도 있습니다.위에 제공된 솔루션은 훌륭하지만, 우아하지는 않지만 더 빠른 솔루션에 관심이 있을 수 있습니다.
#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개인 100000개 요소 어레이에서 100000개의 테스트된 복사본과 memcpy 비교:
copy() = 9.4986초
memcpy() = 9.45058초
B 크기: 루프 수가 100000개인 100000개 요소 어레이에서 100000개의 테스트된 복사본과 memcpy 비교:
copy() = 8.88585초
memcpy() = 9.01923초
B 크기: 루프 수가 100000개인 100000개 요소 어레이에서 100000개의 테스트된 복사본과 memcpy 비교:
copy() = 8.16599초
memcpy() = 8.62316초
B 크기: 루프 수가 100000개인 100000개 요소 어레이에서 100000개의 테스트된 복사본과 memcpy 비교:
copy() = 8.97016초
memcpy() = 8.76941초
언급URL : https://stackoverflow.com/questions/26219721/assign-c-array-to-cs-stdarray-stdarrayt-u-tu-no-suitable-const
'programing' 카테고리의 다른 글
systemd가 있는 데이터베이스 파일에 대해 모니터 파일 변경이 작동하지 않음 (0) | 2023.08.31 |
---|---|
PowerShell 버전 2에서 문자열을 바이트 배열로 변환 (0) | 2023.08.31 |
Mysql Dump를 사용하여 보기 백업 (0) | 2023.08.31 |
도커: 도커 컨테이너의 로그를 올바르게 지우는 방법은 무엇입니까? (0) | 2023.08.31 |
NSMutableAttributeString에서 링크 색상 변경 (0) | 2023.08.31 |