【问题标题】:Removing consecutive duplicate characters from a std::string从 std::string 中删除连续的重复字符
【发布时间】:2024-05-17 18:35:02
【问题描述】:

我目前正在尝试删除重复字符。例如:

  • maaaaaaa 变成了 ma
  • aaaaassssdddddd 变成 asd

我写了以下代码:

string.erase(remove(string.find_first_of(string[i]) + 1, string.end(), string[i]), string.end());

但显然 std::string 返回指向字符串最后一个 + 1 字符的指针,而不是大小,有什么想法可以从字符串中从该字符旁边的位置开始删除 string[i] 吗?

【问题讨论】:

  • 你能举个例子输入和想要的输出吗?
  • 输入:maaaaaaa 输出:ma 输入:aaasssssssssdddddd 输出:asd
  • 您是否想通过一次调用上述代码来做到这一点?因为您在那里指定了一个 i。我不是要求为您的最终目标提供预期输入和预期输出,只是针对给定的代码示例(即您可能需要在预期输入中包含i)。
  • 不,这只是一段代码,本杰明解决了我的问题,不过谢谢:)
  • @Frows:对于特定字符的重复不一定都是相邻的输入,您的预期输出是什么,例如:“aaabbbaaabbb”?因为对于您描述的情况,您可以使用string.erase(std::unique(string.begin(), string.end()), string.end()); 一次性完成所有操作--

标签: c++ string


【解决方案1】:

string.find_first_of 返回一个整数位置(如果未找到则返回string::npos)。这与需要迭代器的std::remove 不兼容。您可以通过将位置添加到开始迭代器来将位置转换为迭代器。

char to_remove = string[i];
auto beg = string.begin() + string.find_first_of(to_remove) + 1;
auto new_end = std::remove(beg, string.end(), to_remove); 
string.erase(new_end, string.end());

【讨论】:

    最近更新 更多