2012-07-22 160 views
1

如果我有以下幾點:選擇最大的「n」值

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <iterator> 

    struct Features{ int F1, F2, F3, F4; }; 

    int criterionFunction(Features const& features) { 
     return 
      -2*features.F1*features.F2 
      +3*features.F1 
      +5*features.F2 
      -2*features.F1*features.F2*features.F3 
      +7*features.F3 
      +4*features.F4 
      -2*features.F1*features.F2*features.F3*features.F4; } 

如何申請transform()找到第一最大值

謝謝。

+1

爲什麼要變換? 'nth_element'或'partial_sort'似乎更合適。 – Philipp 2012-07-22 20:36:07

+1

請更具體。這可能是一個線性優化問題,或者您只想從現有列表中選擇一些元素。 – Philipp 2012-07-22 20:37:11

回答

1

你不行。這不是std::transform所做的。

transform將單個函數應用於序列中的每個元素。它不會選擇特定的元素。

1

結合使用std::transform,std::multiset和插入迭代器,您可以。

vector<Features> v; 
...fill it up 
multiset<int> ms; 
transform(v.begin(), v.end(), inserter(ms, ms.begin()), criterionFunction); 

然後三個最大值是最後三個元素。

2

下面是使用nth_element一個簡單的功能,對象和標準功能的例子(以減少混亂):

#include <algorithm> 
#include <vector> 
#include <iterator> 
#include <iostream> 

typedef int Features; 

int criterionFunction(Features features) { 
    return features; 
} 

int main() { 
    std::vector<Features> v { 0, 4, 2, 5, 4, 3, -2, 1 }; 
    std::nth_element(v.begin(), v.begin() + 3, v.end(), 
        [](Features a, Features b) { 
         return criterionFunction(a) > criterionFunction(b); 
        }); 
    std::copy(v.begin(), v.begin() + 3, 
      std::ostream_iterator<Features>(std::cout, " ")); 
} 

的原裝Features對象,它可能是有用的緩存/ memoize的該criterionFunction結果以防止重複呼叫。

請注意,nth_element不會對兩個分區中的元素進行排序;如果您想按排序順序排列前三個元素,請改爲使用partial_sort

+0

請注意''nth_element'不會導致3個項目_in order_。部分排序會做到這一點。 – sehe 2012-07-22 21:23:18

+0

@sehe OP沒有要求他們訂購:) 雖然我正在添加一個評論。 – Philipp 2012-07-22 21:31:28