好吧,我是從 leetcode“ https://leetcode.com/problems/valid-palindrome/ ”中解決這個問題并洗掉我使用的標點符號
for (auto i:s)
{
if (ispunct(i))
{
s.erase(remove(s.begin(), s.end(), i), s.end());
continue;
}
}
但是當它運行時,它會在字串中留下一些標點符號,如下所示:ip->“Marge,讓我們“[去了]。”我等待 {news} 電報。” op->“margelets[wentiawaitnewselegram”
uj5u.com熱心網友回復:
在回圈時修改字串(或任何其他集合)是一個壞主意。您對字串的迭代器基于回圈開始時字串的狀態。更改回圈內字串的狀態可能會導致迭代器出現意外行為。
相反,您可能想要創建一個沒有違規字符的新字串。
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
int main() {
std::string s1 = "Hello world!";
std::string s2;
std::copy_if(s1.begin(), s1.end(),
std::back_inserter(s2),
[](auto ch) { return !std::ispunct(ch); });
std::cout << s2 << std::endl;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/517233.html
標籤:C
下一篇:獲取頂層3d噪聲
