[Rcpp-devel] Const correctness of NumericVector iterators
Dirk Eddelbuettel
edd at debian.org
Wed Nov 26 17:15:44 CET 2014
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
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
More information about the Rcpp-devel
mailing list