2012-02-18 5 views
0

같은 더 STL/다음보다 효율적인 STL,

for (int i=0 ; i< N ; ++i) 
{ 
    mystruct[i].key = myfunction(xp[i], yp[i], zp[i]); 
    mystruct[i].index = i; 
} 
MYSTRUCT 유형이다

struct KeyIndex 
{ 
    int key; 
    int index; 

}; 

XP, YP, ZP을하는 효율적인 방법이 크기가 3 개의 부동 소수점 배열이다. N

double xp[N]; 
double yp[N]; 
double zp[N]; 

이고 myfunction은 서명이있는 일부 함수이다. int myfunction (int, int ,int)

myfunction 기능을 STL 용 functor로 변경해야하는 경우 좋습니다.

struct TheFunctor 
{ 
    double *xp, *yp, *zp; 
    int idx; 

    TheFunctor(double * Xp, double * Yp, double * Zp) : xp(Xp), yp(Yp), zp(Zp), idx(0) {}; 

    KeyIndex operator()() 
    { 
     KeyIndex ret; 
     ret.key=idx++; 
     ret.value=myfunction(*(xp++), *(yp++), *(zp++)); 
    } 
}; 

TheFunctor fn(xp, yp, zp); 
std::generate(begin(mystruct), end(mystruct), fn); 

를하지만 확실하지 빠르게이며, 그것은 방법이 더 애매한 더 좋은 이유입니다 :

+3

이것은 기능적 스타일의 솔루션을 찾는 것이 쓸모없는 합병증인데 코드가 실제 이유없이 더 모호한 경우 중 하나라고 생각합니다. –

+0

@MatteoItalia : 이것은 Functor를 사용하는 데 익숙해 지도록하는 간단한 연습이라고 가정합니다. –

+0

회원 이름을 기반으로지도와 같은 구조를 구축하려는 것 같습니다. 다음과 같은 것을 고려할 수 있습니다 :'std :: map mymap; –

답변

1

당신은 할 수 있습니다. 의견에서 언급했듯이, 이것은 간단한 for 루프가 더 좋은 경우 중 하나입니다.

+0

for 루프가 더 좋다고 동의하지만 다른 방법이 있습니다. (int i = 0; i

0

mufunctionN 번을 실제로 평가하지 않고 N 키 값을 계산할 수있는 데이터 구조 또는 myfunction 함수가 있습니까?

숫자가 sum(n) 인 배열 arr까지 요소의 합계를 계산하는 것은 n입니다. n = 1234로 전화를 걸면 n = 1235로 전화 할 필요가 없습니다. 그 이유는 아무 이유없이 처음 1234 번호를 추가하기 때문입니다. 이 경우 sum (1235) = sum (1234) + arr [1234]보다 훨씬 빠르게 계산할 수 있습니다.

(xp, yp, zp) 매개 변수가 배열에 여러 번 나타나는 경우 최적화가됩니다. 이 경우 불필요하게 동일한 매개 변수를 사용하여 myfunction 번을 여러 번 호출하여 동일한 결과를 얻으실 수 있습니다.

데이터 배열이 크지 만 훨씬 더 작은 고유 값 집합이 있으면 정렬 캐시에 결과를 메모 할 수 있습니다. myfunction을 호출하기 전에 캐시를 검사하여 아직 결과를 계산하지 않았는지 확인하십시오. 캐시 된 값을 사용했거나 계산하고 계산하지 않은 경우 캐시에 추가하십시오.

그렇지 않으면 의미있는 방식으로 최적화하지 않을 수 있으며 대신 가능한 가독성있게 작성해야합니다.