[Rcpp-devel] Const correctness of NumericVector iterators

Dirk Eddelbuettel edd at debian.org
Wed Nov 26 18:20:26 CET 2014


On 26 November 2014 at 10:15, Dirk Eddelbuettel wrote:
| 
| Hi Martyn,
| 
| On 26 November 2014 at 13:20, Martyn Plummer wrote:
| | This is related to David Shih's thread about modifying input arguments
| | but I think it needs its own thread.
| | 
| | I found a problem when I tried porting some Rcpp code to run outside of
| | Rcpp by providing my own NumericVector implementation based on STL
| 
| Interesting. I have seen that use case.  Typically I have 'real' C++ code

A "not" was missing there:  "I have not seen that use case".   Sorry,  Dirk

| using STL which I'd then bring to R(cpp).
| 
| | vectors. In Rcpp it is possible to obtain a non-constant iterator for a
| | constant vector, whereas STL does not allow this.
| | 
| | In particular, it is possible to modify a const NumericVector. The
| 
| "Not on purpose" but mostly because we get a SEXP we cannot protect better?
| 
| | compiler allows this because the actual contents of the NumericVector
| | are in auxiliary memory. But this breaks the abstraction of the
| | NumericVector class.
| | 
| | An example is given below.  The "sumsquares" function calculates the sum
| | of squares of a vector. Internally, it calls the "workhorse" function,
| | which is declared to take a constant reference as an argument. So it
| | looks safe to pass the input vector to "workhorse" without copying.
| | However the implementation of "workhorse" does in fact alter the vector.
| 
| Isn't that an argument for just using STL vectors ?
| 
| Otherwise, patches/pull requests always welcome...
| 
| Dirk
| 
| | 
| | ### BEGIN SS.cc
| | #include <Rcpp.h>
| | 
| | using Rcpp::NumericVector;
| | 
| | static double workhorse(NumericVector const &v);
| | 
| | // [[Rcpp::export]]
| | double sumsquares(NumericVector v)
| | {
| |     //Since workhorse takes a constant reference we think we do not need
| |     //to copy v...
| |     return workhorse(v);
| | }
| | 
| | double workhorse(NumericVector const &v)
| | {
| |     double y = 0;
| |     for (NumericVector::iterator i = v.begin(); i != v.end(); ++i) {
| |         double &x = *i;
| |         //... but this function does alter its argument
| |         x *= x;
| |         y += x;
| |     }
| |     return y;
| | }
| | ### END SS.cc
| | 
| | In R we have 
| | 
| | > library(Rcpp)
| | > sourceCpp("SS.cc")
| | > x <- c(1,2,3)
| | > sumsquares(x)
| | [1] 14
| | > x #is modified
| | [1] 1 4 9
| | 
| | Martyn
| | 
| | 
| | -----------------------------------------------------------------------
| | This message and its attachments are strictly confidential. If you are
| | not the intended recipient of this message, please immediately notify 
| | the sender and delete it. Since its integrity cannot be guaranteed, 
| | its content cannot involve the sender's responsibility. Any misuse, 
| | any disclosure or publication of its content, either whole or partial, 
| | is prohibited, exception made of formally approved use
| | -----------------------------------------------------------------------
| | _______________________________________________
| | Rcpp-devel mailing list
| | Rcpp-devel at lists.r-forge.r-project.org
| | https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
| 
| -- 
| http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

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


More information about the Rcpp-devel mailing list