我一直在更新我幾乎兩年前寫過的程序,並且遇到了一個調用來從字符串中刪除所有標點符號和空格。刪除標點符號查詢
該調用工作正常,但我不確定它是否是最有效的方法。
的代碼行低於:
tempMessage.erase(remove_if(tempMessage.begin(), tempMessage.end(), (int(*)(int))ispunct), tempMessage.end());
我沒有,我想出了這個或它是如何放在一起回味,但我希望能夠充分理解這一呼籲。
我得到的std :: string.erase擺脫了第一個參數,直到第二個參數。我還可以看到remove_if是如何定義開始點和結束點的,但任何人都可以告訴我remove_if調用的第三個參數來自哪裏?
我不記得爲什麼我的生活需要(int(*)(int))。
在查看代碼時,任何人都可以改進它,或使其更高效嗎?
謝謝
看來我當時正在尋找一個快速解決方案,而且這樣做的確如此。你能解釋一下你在答案中定義的結構嗎?它看起來像是返回true,如果char是一個punct字符,但我不明白ispunct調用之前的兩個分號。我也不是很熟悉bool操作符()const的實現。你還可以擴展這個嗎?麻煩抱歉。 – Matthew
沒問題。 '::'是一個範圍解析運算符。它只是確保我們從''得到'ispunct',而不是另一個。 (這裏不需要)'bool operator()(...)'是一個函數調用操作符:它意味着編譯器可以像調用函數一樣「調用」對象。這樣的對象被稱爲功能對象或函子,並且廣泛用於C++。 –
只是爲了我自己的清晰。如何將一個'char'傳遞給'int ispunct(int ch)'未定義的行爲,但傳遞一個'unsigned char'是* not *?前者是否不在標準(4.5/4.7)中整體促銷的結果範圍內,如果不是,後者又如何? – WhozCraig