2012-04-16 4 views
0

std::vectors (const & 전달)을 허용하고 큰 벡터 (값순)를 반환하는 함수가 있습니다. 내 코드의 한 부분에서, 내가 수행해야합니다반복자를 사용하여 반복 가능 함수를 통해 반복 함수를 매핑하는 C++

std::list<std::vector<double> > all_vectors; 
// all_vectors is filled with values somewhere in here 
for (const std::vector & v : all_values) 
{ 
    std::vector<double> res = f(v); 
    // do something with res 
} 

을 내 코드의 다른 부분에서 내가 수행해야합니다

std::list<std::vector<double> > all_vectors; 
// all_vectors is filled with values somewhere in here 
for (const std::vector & v : all_values) 
{ 
    std::vector<double> res = f(v); 
    // do something different with res 
} 

가장 간단한 방법 (메모리 돼지) : 그것을 단순히 을 통해 f을 매핑 한 다음 결과를보고 // do something with res 또는 // do something different with res (각 경우에 대해)을 수행하여 코드를 재사용하는 것은 간단합니다. 이것의 단점은 내가 불필요하게 큰 std::vector의 긴 목록을 저장할 필요가 있다는 것이다. 한편으로, 나는 내가 가질 수있는 것보다 더 많은 기억을 사용하지 않을 것이라는 확신이있다. 그러나 그렇다고해도 불필요하게 거대한 양의 데이터를 저장하는 것은 나쁜 습관처럼 보입니다. 하나의 옵션은지도처럼 동작 일부 iterator_map 함수를 작성하는 것입니다,하지만이 필요로 결과를 생성합니다

옵션 1 (사용 반복자는이 요청으로 결과를 생성합니다). 나는 이것이 파이썬의 yield에 꽤 도움이 될 것이라고 생각한다.

옵션 2 (사용 객체 지향 설계) : 하나 개의 파생 클래스에서, g// do something with res을 수행 할 것이며, 다른에서, 그것은 // do something different with res을 수행 할 것입니다 : 또 다른 옵션은 ABC 상속을 사용하고 기능 g을 무시하는 것입니다.

옵션 3+ (???) :

난 정말 당신이 C++에서이 같은 문제를 처리 할 방법에 대한 조언을 듣고 싶습니다. 미리 감사드립니다.

+0

f (v)는 벡터를 필터링하고 v의 하위 집합을 반환합니다. – Jagannath

+0

아니요,'f (v)'는'v'에있는 값의 조밀 한 가우스 평활을 계산합니다. – user

답변

1

왜 값을 기준으로 벡터를 반환해야합니까? 참조로 돌아와 vector<double>::const_iterator을 사용할 수 있다면 원래 벡터를 수정하지 않을 것이라는 확신을 얻을 수 있습니다.

복사가 필요하면 두 경우 모두 다른 사본이 필요할 것이므로 옵션 0은 작동하지 않습니다.

목록의 벡터에서 매시업 콜렉션을 컴파일하는 경우 반복기 옵션이 나에게 가장 잘 들립니다. operator++을 호출 할 때마다 다음 요소를 동적으로 계산할 수 있습니다.

+0

결과가'v'에서 만들어지기 때문에 값으로 반환해야합니다. 하지만 반복자라면 하나의'const &'반환 값을 할당하고 반환 할 수 있다는 것에 동의합니다. 하지만 할당/할당 해제 비용을 제외하면 런타임은 대략 동일합니다 (반환 값의 모든 요소가 계산되어야하고 반환 값의 복사본은 한 번에 하나만 존재하게됩니다). – user

+0

필자는 이터레이터를 사용했으며 훌륭하게 작동합니다. 감사! – user

관련 문제