gpt4 book ai didi

c++ - 如何计算 QString 开头的重复字符?

转载 作者:太空狗 更新时间:2023-10-29 19:39:10 25 4
gpt4 key购买 nike

我正在处理一个行列表,我需要计算开头出现的哈希值。

#  item 1
## item 1, 1
## item 1, 2
# item 2

等等。

如果每一行都是一个 QString,我怎样才能返回出现在字符串开头的哈希数?

QString s("### foo # bar ");
int numberOfHashes = s.count("#"); // Answer should be 3, not 4

最佳答案

平凡的:

int number_of_hashes(const QString &s) {
int i, l = s.size();
for(i = 0; i < l && s[i] == '#'; ++i);
return i;
}

在其他语言(主要是解释型语言)中,您不得不担心对字符进行迭代,因为它很慢,并且将所有内容委托(delegate)给库函数(通常用 C 编写)。在 C++ 中,迭代在性能方面是非常好的,所以一个脚踏实地的 for 循环就可以了。


为了好玩,我制作了a small benchmark将这个简单的方法与来自 OP 的 QRegularExpression 方法进行比较,可能带有缓存的 RE 对象。

#include <QCoreApplication>
#include <QString>
#include <vector>
#include <QElapsedTimer>
#include <stdlib.h>
#include <iostream>
#include <QRegularExpression>

int number_of_hashes(const QString &s) {
int i, l = s.size();
for(i = 0; i < l && s[i] == '#'; ++i);
return i;
}

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
const int count = 100000;
std::vector<QString> ss;
for(int i = 0; i < 100; ++i) ss.push_back(QString(rand() % 10, '#') + " foo ## bar ###");
QElapsedTimer t;
t.start();
unsigned tot = 0;
for(int i = 0; i < count; ++i) {
for(const QString &s: ss) tot += number_of_hashes(s);
}
std::cerr<<"plain loop: "<<t.elapsed()*1000./count<<" ns\n";
t.restart();
for(int i = 0; i < count; ++i) {
for(const QString &s: ss) tot += QRegularExpression("^[#]*").match(s).capturedLength();
}
std::cerr<<"QRegularExpression, rebuilt every time: "<<t.elapsed()*1000./count<<" ns\n";

QRegularExpression re("^[#]*");
t.restart();
for(int i = 0; i < count; ++i) {
for(const QString &s: ss) tot += re.match(s).capturedLength();
}
std::cerr<<"QRegularExpression, cached: "<<t.elapsed()*1000./count<<" ns\n";
return tot;
}

正如预期的那样,基于QRegularExpression 的速度比两个数量级慢:

plain loop: 0.7 ns
QRegularExpression, rebuilt every time: 75.66 ns
QRegularExpression, cached: 24.5 ns

关于c++ - 如何计算 QString 开头的重复字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52064588/

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