gpt4 book ai didi

c++ - 迭代字符串中单词的最有效方法

转载 作者:太空狗 更新时间:2023-10-29 20:53:32 26 4
gpt4 key购买 nike

如果我想遍历字符串中的单个单词(由空格分隔),那么显而易见的解决方案是:

std::istringstream s(myString);

std::string word;
while (s >> word)
do things

但是这样效率很低。在初始化字符串流的同时复制整个字符串,然后将每个提取的单词一次一个地复制到word变量中(这接近于第二次复制整个字符串)。有没有一种方法可以在不手动遍历每个字符的情况下对此进行改进?

最佳答案

在大多数情况下,复制只占总成本的很小一部分,因此拥有干净、可读性强的代码变得更加重要。在极少数情况下,当时间分析器告诉您复制会造成瓶颈时,您可以在标准库的帮助下迭代字符串中的字符。

您可以采用的一种方法是使用 std::string::find_first_ofstd::string::find_first_not_of 成员函数进行迭代,如下所示:

const std::string s = "quick \t\t brown \t fox jumps over the\nlazy dog";
const std::string ws = " \t\r\n";
std::size_t pos = 0;
while (pos != s.size()) {
std::size_t from = s.find_first_not_of(ws, pos);
if (from == std::string::npos) {
break;
}
std::size_t to = s.find_first_of(ws, from+1);
if (to == std::string::npos) {
to = s.size();
}
// If you want an individual word, copy it with substr.
// The code below simply prints it character-by-character:
std::cout << "'";
for (std::size_t i = from ; i != to ; i++) {
std::cout << s[i];
}
std::cout << "'" << std::endl;
pos = to;
}

Demo.

不幸的是,代码变得更难阅读,所以你应该避免这种改变,或者至少推迟到需要它时。

关于c++ - 迭代字符串中单词的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42398090/

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