- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想创建一个函数,将一个字符串逐个字符拆分为等长 n
的子字符串,并返回一个字符 vector 。
例如F('atgctgttg',n=5)
应该返回
'atgct','tgctg','gctgt','ctgtt','tgttg'
我尝试了两种不同的功能:
// [[Rcpp::export]]
CharacterVector f( const std::string str, const int n ) {
int lim = str.length() - n + 1;
CharacterVector result( lim );
for ( int j = 0; j < lim; j++ )
{
result[j] = str.substr( j, n );
}
return result;
}
和
// [[Rcpp::export]]
CharacterVector f1( const std::string str, const int n ) {
const int lim = str.length();
const int n1 = n - 1;
CharacterVector result( lim - n1 );
int j = 1;
std::string tmp = str.substr( 0, n );
result[0] = tmp;
for ( int i = n; i < lim; i++ )
{
tmp.erase( 0, 1 );
tmp.push_back( str[i] );
result[j] = tmp;
j++;
}
return result;
}
我也尝试过使用迭代器,但它并不比函数 f1
快。请注意,Rcpp 将输入转换为引用变量。有没有更快的方法来做到这一点?
最佳答案
编译器会把你的f
如果您更改为通过引用复制:CharacterVector f(const std::string& str, const int n)
虽然您看不到速度提升,但您绝对可以通过取消 CharacterVector
来简化您的流程。并且只使用 vector<string>
:
const string str("atgctgttg");
const int n = 5; // Assumed positive number smaller than str.size()
const int n1 = n - 1;
vector<string> result(str.size() - n1);
transform(str.cbegin(), str.cend() - n1, result.begin(), [n](const auto& i) {return string(&i, n);});
[ Live Example ]
您可以看到速度改进的一种方法是,如果您可以使用 array
而不是 string
:
const string str("atgctgttg");
const int n1 = N - 1;
vector<array<char, N>> result(str.size() - n1);
transform(str.cbegin(), str.cend() - n1, result.begin(), [](const auto& i) {
array<char, N> result;
copy_n(&i, N, result.begin());
return result;
});
[ Live Example ]
但到目前为止最快(也是最好)的方法就是在原始 string
上工作并且不将其分解为 string
的数组秒。这需要在后端做更多工作,因为您需要使用 c 字符串而不是 std::string
秒。例如,我使用了 for (auto& i : result) cout << string(i.data(), N) << endl;
打印我所有的 vector
s,但如果你没有使用 vector
你可以这样打印:for (auto i = str.cbegin(); i != str.cend() - n1; ++i) printf("%.*s\n", n, &*i);
显然需要更多工作,但如果您的 str
很大,你会发现它更快。
[ Live example ]
关于c++ - 将字符串拆分为等长子字符串的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34746575/
我是一名优秀的程序员,十分优秀!