gpt4 book ai didi

c++ - std::string::erase() 删除使用 std::string::find() 找到的第一个字符后的所有内容

转载 作者:行者123 更新时间:2023-11-30 00:48:51 25 4
gpt4 key购买 nike

我仍然难以为这个问题写出标题,看看这段代码:

#include <iostream>
#include <string>
#include <algorithm>

int main(){
std::string s1 = " Hello World 1 ";
std::string s2 = " Hello World 2 ";
while(s1.find(' ') != std::string::npos){
s1.erase(s1.find(' '));
}
while(s2.find(' ') != std::string::npos){
s2.erase(std::find(s2.begin() , s2.end() ,' '));
}
std::cout<<s1<<"\n";
std::cout<<s2;
return 0;
}

我正在使用 std::string::find() 来检测字符串中是否存在空白,如果仍然存在,则使用 std::string::erase() 删除它们。

我尝试了两种不同的方法:

s1.erase(s1.find(' '));

s2.erase(std::find(s2.begin() , s2.end() ,' '));

但是在第一种方法中,它会在字符串中找到第一次出现的 ' ' 空格并删除它和它后面的所有内容。第二种方法按预期工作。

当前输出是:

HelloWorld2

谁能告诉我第一种方法在第一次出现后删除所有内容的原因是什么?快速浏览:link

相关链接:

std::basic_string::find

std::find

std::basic_string::erase

最佳答案

I'm using std::string::find() to detect the presence of whitespace inside string , and if still present , use std::string::erase() to delete them.

您不需要在每次循环迭代中调用两次 find()。调用一次并将返回值保存到一个变量,然后检查该变量的值并在需要时将其传递给 erase()

I've tried two different methods of doing this

s1.erase(s1.find(' '));

and

s2.erase(std::find(s2.begin() , s2.end() ,' '));

however in 1st method , it finds the 1st occurence of ' ' whitespace inside string and deletes it and everything following it.

阅读documentation你链接到。您正在调用以索引作为第一个参数的 erase() 版本:

basic_string& erase( size_type index = 0, size_type count = npos );

当您没有指定 count 值时,它会被设置为 npos,这会告诉 erase() 删除所有内容string 开始,从指定的 indexstring 的结尾。您的 string 以空格字符开头,因此您要清除整个字符串,这就是它没有出现在输出中的原因。

您需要将 count 指定为 1 以仅删除 find() 找到的空格字符:

do
{
std::string size_type pos = s1.find(' ');
if (pos == std::string::npos)
break;
s1.erase(pos, 1); // <-- erase only one character
}
while (true);

或者,您应该使用 find() 的第二个参数,这样您就可以在上一次迭代停止的地方开始下一次循环迭代。否则,您每次都会回到字符串的开头并重新搜索您已经搜索过的字符:

std::string::size_type pos = 0;
do
{
pos = s1.find(' ', pos); // <-- begin search at current position
if (pos == std::string::npos)
break;
s1.erase(pos, 1); // <-- erase only one character
}
while (true);

或者,如果您愿意:

std::string::size_type pos = s1.find(' ');
while (pos != std::string::npos)
{
s1.erase(pos, 1); // <-- erase only one character
pos = s1.find(' ', pos); // <-- begin search at current position
}

2nd method works as expected.

您正在调用不同版本的 erase():

iterator erase( iterator position );

std::find() 返回一个 iterator。此版本的 erase() 仅删除迭代器指向的单个字符。

关于c++ - std::string::erase() 删除使用 std::string::find() 找到的第一个字符后的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30472509/

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