gpt4 book ai didi

c++ - 将字符串拆分为等长子字符串的更快方法

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:06 24 4
gpt4 key购买 nike

我想创建一个函数,将一个字符串逐个字符拆分为等长 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com