<div dir="ltr">Dears,<br><br><div><div class="gmail_quote"><div dir="ltr"><div><div><div>thanks. In fact I've found the problem while looking for a workaround to the push_back() slowness (used here for convenience only). The workaround was to preallocate the List, then discard the unneeded portion, for which I looked into erase(). This was many orders of magnitude faster.<br>


<br></div>The single-argument erase() also seems to behave unexpectedly (below).<br><br></div>Best<br></div>Toni<br><div><div><div><div class="im"><br>#include <Rcpp.h><br>#include <iostream><br><br>// [[Rcpp::export]]<br>

</div>SEXP truncateTest2() {<br>
<br>  using namespace std;<br>  using namespace Rcpp;<div class="im"><br>  Rcpp::List l;<br>  std::vector<int> v;<br><br>  for (int i=1; i<=10; i++) {<br>    v.push_back(i);<br>    l.push_back(i);<br>  }<br><br>

</div>  // Attempt truncation in another way<br>
  vector<int>::iterator vi=v.begin()+1;<br>  while(vi!=v.end()) <br>    vi=v.erase(vi);        // This works<div class="im"><br>  cout << "std::vector left with " << v.size() << endl;<br>

<br></div>
  Rcpp::List::iterator li=l.begin()+1;<br>  while(li!=l.end()) <br>    li=l.erase(li);        // This doesn't<div class="im"><br>  cout << "Rcpp::List  left with " << l.size() << endl;<br>

<br></div>  return(R_NilValue);<div class="im"><br>
}<br><br></div><br><br><br><div><br></div></div></div></div></div><div class="gmail_extra"><div><div class="h5"><br><br><div class="gmail_quote">
On Wed, Jun 5, 2013 at 2:50 PM, Romain Francois <span dir="ltr"><<a href="mailto:romain@r-enthusiasts.com" target="_blank">romain@r-enthusiasts.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


Thanks. I'll have a look.<br>
<br>
Le 05/06/13 14:09, Toni Giorgino a écrit :<div><div><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Dears,<br>
<br>
I am a newbie to Rcpp.  I may have found an off-by-one inconsistency in<br>
the handling of  List::erase(iter1,iter2) operation with respect to its<br>
homologous in the STL (which I suppose is intended to mimic).  In STL,<br>
iter2 can be the container's .end(); in Rcpp, the same gives an out of<br>
boundary error. (See below)<br>
<br>
Thanks for the incredible package. Best<br>
<br>
Test case...<br>
<br>
#include <Rcpp.h><br>
#include <iostream><br>
<br>
// [[Rcpp::export]]<br>
SEXP truncateTest() {<br>
BEGIN_RCPP<br>
<br>
   using namespace std;<br>
   Rcpp::List l;<br>
   std::vector<int> v;<br>
<br>
   for (int i=1; i<=10; i++) {<br>
     v.push_back(i);<br>
     l.push_back(i);<br>
   }<br>
<br>
   v.erase(v.begin()+5,v.end()-1)<u></u>;<br>
   l.erase(l.begin()+5,l.end()-1)<u></u>; // ?<br>
<br>
   cout << "std::vector left with " << v.size() << endl;<br>
   cout << "Rcpp::List  left with " << l.size() << endl;<br>
<br>
END_RCPP<br>
}<br>
<br>
/*** R<br>
#  library(Rcpp)<br>
#  sourceCpp("truncateTest.cpp")<br>
#  truncateTest()<br>
#  #prints 6 and 5<br>
*/<br>
</blockquote>
<br>
<br>
-- <br></div></div>
Romain Francois<br>
Professional R Enthusiast<br>
+33(0) 6 28 91 30 30<br>
<br>
R Graph Gallery: <a href="http://gallery.r-enthusiasts.com" target="_blank">http://gallery.r-enthusiasts.<u></u>com</a><br>
<br>
blog:            <a href="http://blog.r-enthusiasts.com" target="_blank">http://blog.r-enthusiasts.com</a><br>
|- <a href="http://bit.ly/Zs97qg" target="_blank">http://bit.ly/Zs97qg</a>  : highlight 0.4.1<br>
`- <a href="http://bit.ly/10X94UM" target="_blank">http://bit.ly/10X94UM</a> : Mobile version of the graph gallery<br>
<br>
</blockquote></div><br><br clear="all"><br></div></div><span class="HOEnZb"><font color="#888888">-- <br>Toni<br><br><br>
</font></span></div>
</div><br><br clear="all"><br>-- <br>Toni<br><br><br>
</div></div>