gpt4 book ai didi

c++ - 如何在不复制的情况下比较字符串的一部分?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:05 24 4
gpt4 key购买 nike

我有一个正在迭代的长字符串,在每次迭代中,我将字符串的一部分与常量进行比较并存储字符串的某些部分。在我的实际代码中,这段代码运行了数百万次,是主要的瓶颈。我认为这是由于过度使用了std::string::substr

#include <iostream>
#include <map>
#include <string>
#include <vector>

int main() {
std::string str("0=My,1=comma,2=separated,3=string,0=with,3=repeated,7=IDs");
std::vector<std::string> out0;
std::map<std::string, std::string> out;

size_t pos = str.find(',');

// loop over the string, collecting "key=value" pairs
while (pos < str.size() - 1) {
if (str.substr(pos + 1, 2) == "0=") {
auto newPos = str.find(',', pos + 3);
out0.push_back(str.substr(pos + 3, newPos - pos - 3);
pos = newPos;
} else {
size_t eqPos = str.find('=', pos + 1);
auto newPos = str.find(',', eqPos + 1);
out[str.substr(pos + 1, eqPos - pos - 1)] = str.substr(eqPos + 1, newPos - eqPos - 1);
}
}

// print out the data structures (this doesn't happen in my actual code)
std::cout << "out0:";
for (auto& entry : out0) {
std::cout << ' ' << entry;
}
std::cout << std::endl;

std::cout << "out:";
for (auto it : out) {
std::cout << ' ' << it->first << '=' << it->second;
}
}

这是我的问题:

  • 如何在不执行复制且不为每个字符编写比较的情况下对字符串执行比较,例如str[pos + 1] == '0' && str[pos + 2] == '=' && ...?
  • 如何存储对子字符串的引用,而不是每次添加到 out0out 时都进行复制?

这可能是使用 char * 的一个很好的案例,但我以前从未使用过它。

编辑:

不幸的是,我只有 C++11;否则,std::string_view 是最佳答案。有没有办法在没有 std::string_view 的情况下完成引用的存储?

最佳答案

如果你有 C++17,你可以这样使用 string_view:(未经测试的代码):

string_view sv{str.data() + pos, 2};
if (sv == "0=") ...

没有拷贝。甚至(一气呵成):

if (string_view{str.data() + pos, 2} == "0=") ...

如果你没有string_view,你可以使用char_traits:

if (std::char_traits<char>::compare(str.data() + pos, "0=", 2) == 0) ...

关于c++ - 如何在不复制的情况下比较字符串的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57379437/

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