programing

C 어레이를 C++의 std:: 어레이에 할당하시겠습니까?(std::array = T[U]) - "T [U]"에서 "std::array"까지 적합한 생성자가 없습니다.

topblog 2023. 8. 31. 23:33
반응형

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

반응형