我想编写一个函数,在给定的索引处将“字符串”按顺序切成向量。我有一个相当合适的 R 解决方案;但是,我认为用 C/C++ 编写代码可能会更快。例如,我希望能够编写一个函数“strslice”,其操作如下:
x <- "abcdef"
strslice( x, 2 ) ## should return c("ab", "cd", "ef")
但是,我不确定如何处理将 Rcpp 代码中传递的“CharacterVector”的元素视为字符串。这就是我想象的可能可行的方法(鉴于我缺乏 C++/Rcpp 知识,我确信有更好的方法):
f <- rcpp( signature(x="character", n="integer"), '
std::string myString = Rcpp::as<std::string>(x);
int cutpoint = Rcpp::as<int>(n);
vector<std::string> outString;
int len = myString.length();
for( int i=0; i<len/n; i=i+n ) {
outString.push_back( myString.substr(i,i+n-1 ) );
myString = myString.substr(i+n, len-i*n);
}
return Rcpp::wrap<Rcpp::CharacterVector>( outString );
')
作为记录,我拥有的相应R代码是:
strslice <- function(x, n) {
x <- as.data.frame( stringsAsFactors=FALSE,
matrix( unlist( strsplit( x, "" ) ), ncol=n, byrow=T )
)
do.call( function(...) { paste(..., sep="") }, x )
}
...但是我认为在数据结构之间跳来跳去会减慢非常大的字符串的速度。
(或者:有没有办法强制“strsplit”按我的意愿行事?)