2017-12-21 8 views
4

하지 않고 배열을 추가 우리가 예를 들어 ++ C에서 명시 적 루프를 작성하지 않고 동일한 크기의 두 개의 배열을 추가 할 방법 : 명시 적 루프가 문제를 벗어나면루프 C++

int a[3]={1,2,3}; 
int b[3]={4,3,2}; 
int c[3]; //to contain sum of a and b 
+3

당신은 루프에 대해 무엇을해야합니까? –

+0

프로젝트에서 여러 번 추가해야하므로 최적화 된 방법이 필요했습니다. –

+2

예 : ['std :: valarray'] (http://en.cppreference.com/w/cpp/numeric/valarray). 이것은 대략 *에 대한 것입니다. –

답변

4

, 다음을 사용 암시적일 수도있다. 표준 라이브러리가 대신 해줍니다.

template<typename T, std::size_t N> 
void add_arrays(T (const &a)[N], T (const &b)[N], T (&c)[N]) { 
    std::transform(a, a + N, b, c, std::plus<T>{}); 
} 

컴파일러 좋을 것입니다 당신을 위해 크기를 확인하십시오

std::transform(a, a + 3, b, c, std::plus<int>{}); 

자신은 종종 같은 크기의 배열에 그 일을 찾을 경우

, 당신도 그것을 템플리트화할 수 있습니다. 그리고 거기서 멈출 필요조차 없습니다. 더 많은 문맥에서 add_arrays을 사용할 수있게하는 많은 방법이 있습니다.


모든 것을 말한 것. 원시 어레이 사용을 중단하십시오. 기본값으로 std::array을 사용하십시오. 원시 배열에 비해 얇은 래퍼이지만 값 의미를가집니다. 그리고 어떤 목적으로 고정 된 컬렉션이 필요하다면 (좌표를 저장하기 위해 그래픽 프로그래밍을하고 있다고합시다) 대신 지정된 유형을 사용하십시오.

+3

여기 우리는 다시 간다. – Bathsheba

0

당신이 정말로 더 루프를 을하지 않으 당신은 그것을 시도 할 수성능 :

더 심각 벡터 스몰하고 성능이 진짜 문제가있는 경우는 SIMD를 사용할 수 있는지
#include <emmintrin.h> 
#include <iostream> 

alignas(16) int32_t a[4] = {1, 2, 3, 0}; 
alignas(16) int32_t b[4] = {4, 3, 2, 0}; 
alignas(16) int32_t c[4]; 

main() 
{ 
    __m128i simd_a = _mm_load_si128((__m128i*)a); 
    __m128i simd_b = _mm_load_si128((__m128i*)b); 


    // No loop for addition and performance is here. 
    // 
    __m128i simd_c = _mm_add_epi32(simd_a, simd_b); 

    _mm_store_si128((__m128i*)c, simd_c); 

    std::cout << "\n" << c[0] << " " << c[1] << " " << c[2] << " " << c[3]; 
} 

. 혼동하지 말고 사용 가능한 우수한 라이브러리 중 하나를 사용하십시오. 같은 C++ 라이브러리의

예 :