[Rcpp-devel] fun(Times) with STL
Silkworth,David J.
SILKWODJ at airproducts.com
Sat Jun 4 18:08:48 CEST 2011
I ran into this yesterday as I needed to get the position of the least
time value in a small Que of times that I had extracted from a more
complex structure. I ended up with this problem during a separate
work-around, which is a story I'd love to tell also.
But, to the point. I explored using STL in areas I had seen no examples
previously.
Nothing in the Rcpp sources suggested that min_element() or
max_element() functions were supported, but I tried anyway.
Only by taking note of the many compiler errors I generated was I able
to come up with this stable line of code:
double* myIterator = std::min_element (TimeQ.begin(), TimeQ.end());
Now, in C++ training I flunked pointers and I skipped class for
templates. But now I need to know what the heck is myIterator.
So, I managed to put it into a single element NumericVector which I
could return to R and examine.
Okay, so this mysterious "iterator" thing is quite intuitively the
expected result of a min_element function (with some pointer witchcraft
included).
To get the position of this item in the TimeQ I ended up building a
small loop.
for(int col=0; col<TimeQ.size(); col++) {
if(TimeQ[col] == *myIterator) {
show_position[0]=col;
break; } }
My question is, "Is there a more elegant way to get the position value
that I need"? This code will be traversed 10's of thousands of times
in the function I am developing.
Here is the full example as I have distilled it down:
src <- '
Rcpp::NumericVector TimeQ(arg1);
Rcpp::NumericVector show_iterator(1);
Rcpp::IntegerVector show_position(1);
double* myIterator = std::min_element (TimeQ.begin(), TimeQ.end());
show_iterator[0] = *myIterator;
for(int col=0; col<TimeQ.size(); col++) {
if(TimeQ[col] == *myIterator) {
show_position[0]=col;
break; } }
return show_position; // alternatively: return show_iterator;
'
fun <- cxxfunction(signature(arg1="numeric"),src,plugin="Rcpp")
Times<-c(1944.285,2920.969,1720.230,1264.438,3607.507,1720.230,25176.020
);
fun_test<- fun(Times)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20110604/15f84012/attachment-0001.htm>
More information about the Rcpp-devel
mailing list