gpt4 book ai didi

c++ - 在 C++ 中搜索和删除字符串中的某些字符

转载 作者:行者123 更新时间:2023-12-01 14:15:48 25 4
gpt4 key购买 nike

我是一名新手程序员,目前正在学习如何使用 C++。我正在尝试完成 CodeWars 上的挑战。该程序应该接受字符串输入,并删除字符串中包含的所有元音。

首先,我创建了一个包含小写和大写元音的字符数组。然后我使用 std::find 函数来搜索输入。我想要发生的是:如果它能够在数组中找到当前字符,它将删除该字符,并重新开始循环。它能够隔离元音,但当我尝试返回修改后的字符串时,遇到了out_of_range of memory 位置错误。

我还是不太明白内存是如何工作的,所以我很感激一些帮助。

#include <string>
#include <iostream>
#include <conio.h>
#include <algorithm>

using namespace std;

string disemvowel(string str)
{

char vowels[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
char *finder;

for (int i = 0; i < str.length(); i++)
{
char active = str[i];
finder = find(vowels, vowels + 10, active);
if (finder != vowels + 10)
{
str.erase(str[i], 0);
}
}

return str;
}

int main() {

string str;
cout << "say something \n";
cin >> str;
cout << disemvowel(str);

_getch();
return 0;
}

感谢帮助

最佳答案

当前代码的问题:

    str.erase(str[i], 0);

这是不正确的。我们来看看 string::erase 在这种情况下函数的签名:

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

第一个参数是 size_type ,这基本上是一个无符号长整数。它是您要删除的字符的索引。第二个也是相同类型,它是您要从 index 中删除的字符数。位置,即 1。您传递给函数的是 str[i]这是 char类型不正确。

固定版本:

str.erase(i, 1);

另外:

finder = find(vowels, vowels + 10, active);

std::find返回一个迭代器,不要给它赋值 char*即使它编译。固定:

auto finder = find(vowels, vowels + 10, active);

您也可以使用标准模板库(STL)中现成的算法来一行解决这个问题:

只需使用 remove_if连同 string::erase :

  std::string str = "hello, world";

str.erase (std::remove_if (str.begin (), str.end (), [](char c)
{
return c == 'a' || c == 'e' || c == 'i'
|| c == 'o' || c == 'u' || c == 'A' || c == 'E' || c == 'I'
|| c == 'O' || c == 'U';
}),
str.end ());
std::cout << str;

如@PaulMckenzie 所述,使用 erase-remove这里的成语比循环变体 + erase 更快(快两倍) . Benchmark on quick-bench那么,为什么它更快?

假设我们有字符串:"Hello cpp"

使用 erase() ,每次我们“删除”一个字符时,它之后的所有字符都需要向后移动一个位置。在这种情况下,我们需要删除 'e' 和 'o',位置 1 和位置 4。

  • 从位置 1 移除字符并将字符 2 移动到字符 8,向后移动一个位置。这意味着我们移动了 7 个字符。
  • 从位置 4 移除字符并将字符 5 移到字符 8 后一位。这意味着我们移动了 4 个字符。
  • 总计:移动了 11 个字符

remove工作方式不同。它只是将一开始不要删除的元素移回,可能会覆盖将要删除的元素。这会大大减少元素的移动,从而使其更快。

查看此 SO Post以获得更详细和更好的解释。

注意:您需要#include <algorithm>为此。

关于c++ - 在 C++ 中搜索和删除字符串中的某些字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62735351/

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