2011-05-23 73 views
5

讓我解釋 '這' 的功能是什麼:是否有在C/C++相同功能以GNU-R,其中()?

從GNU-R幫助:

該指數是正確的?

給一個邏輯對象的「TRUE」的索引,從而允許陣列索引。

或示出某些代碼:(GNU-R開始計數索引與1)

> x <- c(1,2,3,1,3,5); 
> which(x == 1); 
[1] 1 4 
> which(x == 3); 
[1] 3 5 
> ll <- c(TRUE,FALSE,TRUE,NA,FALSE,FALSE,TRUE); 
> which(ll); 
[1] 1 3 7 

沒有人知道在C/C類似的功能++?

感謝您的幫助

rinni

+0

['std :: find_if'](http://en.cppreference.com/w/cpp/algorithm/find)或['std :: copy_if'](http://en.cppreference.com/ w/cpp/algorithm/copy)取決於你想要用它做什麼。 (或其他幾個圖書館電話) – 2012-12-20 17:40:57

回答

6

你必須明白,R是矢量化,而C則首先適用於原子化的個人數據片段:一個intdouble,...

使用C++,你可以看看STL算法與您接近這個。

最後,在R和C++交叉點,我們的Rcpp封裝具有在C++一些矢量操作模仿一些操作;請參閱Rcpp-sugar pdf小插圖瞭解更多(和/或我們有關Rcpp的一些會談)。

+0

你是絕對正確的。我的拳頭方法是以R爲中心的。猜猜我必須嘗試一下C++的觀點。 – rinni 2011-05-24 08:39:58

2

算法std::find_if應該做的伎倆 - 連同一個循環我要補充。

3

創建一個仿函數對象,您可以用匹配值初始化,以及迭代器來使用std::for_each列表。例如:

vector<int> values; 
//fill your vector with values; 

struct match_functor 
{ 
    vector<int> value_array; 
    int match_value; 

    match_functor(int value): match_value(value) {} 

    void operator() (int input_value) 
    { 
     if(match_value == input_value) 
      value_array.push_back(input_value); 
    } 
}; 

match_functor matches(1); 
std::for_each(values.begin(), values.end(), matches); 

現在您的結果值數組可以使用matches.value_array[INDEX]訪問。

作爲替代方案,如果你只是想有原始載體的indicies,而不是實際值,那麼你可以爲你的仿函數對象做這樣的事情:

struct match_functor 
{ 
    vector<int> index_array; 
    int match_value; 
    int index; 

    match_functor(int value): match_value(value), index(0) {} 

    void operator() (int input_value) 
    { 
     if(match_value == input_value) 
      index_array.push_back(index); 

     index++; 
    } 
}; 

match_functor matches(1); 
matches = std::for_each(values.begin(), values.end(), matches); 

現在matches.index_array[INDEX]將舉行的一部開拓創新向量從原來的矢量匹配值1,而不是實際的數值,所述indicies。

+1

你的第一個代碼片段只是'的std :: remove_copy_if'的更復雜的替代品。 – 2011-05-23 14:15:03

+0

雖然它並沒有刪除任何值,但它將原始向量中發生次數的所需值複製N次。 – Jason 2011-05-23 14:21:40

+2

@Jason是的,它將輸入向量中的值複製到其他值,從而刪除(不復制)不符合某些謂詞的任何值。這就是'std :: remove_copy_if'的作用。 – 2011-05-23 14:59:33

相關問題