2016-11-21 5 views
-2

У меня есть этот код в Python:Преобразование понимания списка Python в 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 предназначен для фиксированного размера, известного во время компиляции.

Вот как можно реализовать:

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; 
} 

Любой приличный компилятор будет оптимизировать этот код так, что возвращаемый vector не копируется на возвращение.

+0

Хотя компилятор _might_ также оптимизирует его, было бы более эффективно просто вызывать 'u (k)' один раз внутри цикла 'for'. – martineau

+0

@martineau: это правда, однако, я намеренно записываю код таким образом, потому что, если я не ошибаюсь, код python, предоставляемый OP, дважды вызывает 'u (k)', когда 'u (k)> 0'; я прав ? – shrike

+0

Правда, но, вероятно, только потому, что нет возможности ввести временную переменную внутри понимания списка. – martineau