[Rcpp-devel] What is the most efficient method to check if a Rcpp vector contains an element?

Dirk Eddelbuettel edd at debian.org
Sun Dec 29 16:26:35 CET 2013


Hi Asis,

On 29 December 2013 at 12:50, Asis Hallab wrote:
| I am just wondering what would be the recommended and most efficient way to
| check, if a Rcpp Vector contains a given element?
| 
| If I am not mistaken the C++ standard approach for very large std::vectors
| would be to first sort them and then perform a binary search:
| 
| http://stackoverflow.com/questions/571394/how-to-find-an-item-in-a-stdvector
| 
| What would be the Rcpp solution for the same task on a Rcpp vector? 

Nothing wrong with what the accepted StackOverflow answer suggested: std::find().

| Should I convert my Rcpp Vector to a std::vector and do the above, as explained
| on the stackoverflow blog?

You don't need to convert.  The STL types such as std::vector use iterators,
and Rcpp was set up in such a way to make this possible.

   ## next line wrapped for mail, otherwise all on one line
   R> cppFunction('bool contains(NumericVector X, double z) { 
         return std::find(X.begin(), X.end(), z)!=X.end(); }')
   R> contains(1:1e5,7777)
   [1] TRUE
   R> contains(1:1e5,-1)
   [1] FALSE
   R> 

One could of course expand on this by wrapping templates around it, but as a
quick-and-dirty solution it is not too bad.

Cheers,  Dirk

-- 
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com


More information about the Rcpp-devel mailing list