2016-11-21 10 views
-2

는 파이썬이 코드가 있습니다파이썬 목록 이해를 C++로 변환 하시겠습니까?

def f(x,n): return [u(k) for k in range(1,n) if u(k) > 0] 

을하지만 C++로 번역하는 방법을 모른다. 잘 할 수는 있겠지만 확실하지 않은 것은 배열을 좋은 방법으로 반환하는 방법과 배열이나 벡터를 사용해야하는 경우입니다. 게다가 나는 그것이 얼마나 압축 될 수 있는지 알고 싶었습니다. 물론 u이 모두 k > 0에 대해 정의되어 있다고 가정합니다.

+0

항상 벡터를 사용해야합니다. 당신은 그것을 돌려 주어야합니다. 좋은 방법이나 나쁜 방법이 없습니다. 컴팩트 한 방식으로 일을하는 경우, 스스로 시도해야합니다. –

+0

x는 함수의 본문에서 사용되지 않습니다. 그리고 k는 어디에도 없습니다 ... x와 k는 같은 변수입니까? – Jurlie

+0

@Jurlie :'k '는'range (1, n)'에서 오는 것이지만'x'가 사용되지 않는 것에 대해 당신은 맞습니다. – martineau

답변

1

반환 할 데이터의 최종 크기를 알 수 없으므로 vector이 좋습니다. array은 컴파일 타임에 알려진 고정 크기 용입니다. 반환에 복사되지 않습니다 반환 vector 있도록

std::vector<decltype(u(0))> f(int n) 
{ 
    std::vector<decltype(u(0))> vec; 
    for (int k = 1; k < n; k ++) 
     if (u(k) > 0) 
      vec.push_back(u(k)); 
    return vec; 
} 

어떤 점잖은 컴파일러는이 코드를 최적화 : 여기

당신이 그것을 구현할 수있는 방법이다.

+0

컴파일러가 _might_에서도 최적화 할 수 있지만'for' 루프 안에서'u (k) '를 한 번 호출하는 것이 더 효율적입니다. – martineau

+0

@martineau : 맞습니다. 그러나 오인하지 않았 으면 OP가 제공 한 파이썬 코드가'u (k)> 0 '일 때'u (k)'를 두 번 호출하기 때문에 의도적으로이 코드를 작성합니다. 내가 맞습니까? – shrike

+0

사실,하지만 아마도 목록 작성 중에 임시 변수를 도입 할 방법이 없기 때문일 것입니다. – martineau