假设我有一个y
长度为 N 的十六进制字符串,形式为y{N}y{N-1}...y{1}
。然后给定另一个x
长度为 L 的十六进制字符串(L 小于 N),我想检查这个字符串出现了多少次(如果有的话)y
......比如说y{N}...x{L}x{L-1}...x{1}...y{j}..x{L}x{L-1}...x{1}....y{1}
. 在 C++ 中执行此操作的最有效方法是什么?...我需要一个非常有效的实现,因为我想为大型数据库运行它
问问题
88 次
3 回答
1
“十六进制”在这里并不意味着什么。C++ 是一种计算机语言,并且适用于位。“十六进制”只是将 4 位组合在一起以供人类使用的便捷方式。
类似地,C++ 不会像y{N}y{N-1}...y{1}
. 它将它们索引为y[0],y[1],y[N-1]
. (没有y[N]
。)
在正常情况下,std::string::find
它会比你的磁盘快,这意味着它已经足够快了。
于 2012-09-24T11:20:42.327 回答
1
在 C++ 中,哪种方法最有效?
尝试您std::search
的std::istream_iterator
输入文件,如下所示:
#include <string>
#include <iterator>
#include <iostream>
#include <algorithm>
int main () {
// std::ifstream input("input.txt");
std::istream& input(std::cin);
std::string search_for("1234");
std::istream_iterator<char> last;
std::istream_iterator<char> it(input);
int count(0);
while((it = std::search(it, last, search_for.begin(), search_for.end())) != last) {
count++;
}
std::cout << count << "\n";
}
如果这还不够快,您可以尝试std::istreambuf_iterator
.
如果这还不够快,您可以尝试对文件进行内存映射并使用初始和最终指针作为迭代器。
于 2012-09-24T15:10:28.530 回答