【发布时间】:2021-09-15 01:42:15
【问题描述】:
我想要一个可以将std::string 对象窗口化为长度为N 的分区的东西 - 例如(使用函数update):
int main() {
std::string s = "abcdefg";
update<2>(s);
return 0;
}
调用上面应该会导致:
ab
bc
cd
ef
fg
我有以下版本的update 函数:
template<std::size_t size>
void update(std::string s) {
std::string result(size, '\0');
std::stringstream ss{s};
int iterations = s.length() - size;
for (int i = 0; i<iterations; i++) {
ss.read(&result[0], result.size());
std::cout << result << std::endl;
}
return;
}
但这会跳过初始字符位于奇数索引处的组合(在我的情况下组合的数量是正确的,即使有重复)
ab
cd
ef
gf
gf
附带说明的是,如果有任何尾随字符,则应从打印值中省略这些字符(尽管我认为这将被for 循环的参数所涵盖)
最后一点是,我希望它尽可能优化,因为我通常会使用长度非常大的字符串(>5M 个字符长) - 我目前的解决方案可能不是最好的,所以我很开放到替代策略的建议。
【问题讨论】:
-
我使用的一条黄金法则是,当我可以命名一个进程的一部分时,这暗示它应该是一个函数本身。在你的情况下,我会分开读取输入和查找那些连续的字符串,编写一个函数
std::set<std::string> consecutive(const std::string& input, size_t length)。这样,您只需要调试不起作用的部分而不是整个事情。您可以重复使用它,例如在不读取用户输入的上下文中。