2011-05-11 183 views
5

我使用轉換算法和std :: toupper來實現這一目標,但是可以在一行中完成,像這樣?將字符串轉換爲所有大寫字母與std :: transform

transform(s.begin(), s.end(), ostream_iterator<string>(cout, "\n"),std::toupper); 

我得到這個錯誤,所以我必須做一個一元函數,這和把它與變換或我可以使用一些適配器?

+1

重要的是發佈您正在獲取的實際錯誤。特別是在對已接受答案的評論中,您已經添加了該錯誤,並且反過來說,問題是重載解決方案。在這一點上,所有的信息,人們可以清楚地解釋問題是什麼以及解決問題的方法,而不僅僅是一個解決方法,它不會幫助你解決下一個類似的問題(使用時的重載解析一個函數在模板中) – 2011-05-11 11:17:35

+0

是的,我忘了錯誤,對不起 – Kobe 2011-05-11 11:31:44

回答

9

使用ostream_iterator<char>代替ostream_iterator<string>

transform(s.begin(),s.end(),ostream_iterator<char>(cout,"\n"),std::toupper); 

std::transform將每個字符,並將它傳遞到輸出迭代器。這就是爲什麼輸出迭代器的類型參數應該是char而不是std::string

順便說一下,每個字符將被打印在換行符上。那是你要的嗎?如果不是,請不要通過"\n"

-

注:您可能需要使用::toupper而不是std::toupper

看到這些

+0

我明白你的意思,但我得到與char相同的錯誤: -/ – Kobe 2011-05-11 11:03:41

+0

錯誤:沒有匹配函數調用'變換(std :: basic_string的:迭代,性病:: basic_string的:迭代,性病:: ostream_iterator ,<懸而未決重載函數類型>)」 – Kobe 2011-05-11 11:04:18

+0

@vBx:可能必須使用':: toupper'代替'的std ::在toupper '。查看編輯和演示。 – Nawaz 2011-05-11 11:05:24

4

首先,如果你想輸出char S(以及所有的char s),你會 需要使用ostreambuf_iterator<char>,而不是 ostream_iterator<string>ostreambuf_iterator<char>表示 比ostream_iterator<char>更好;你是 直接輸出char,沒有格式化任何東西。 (ostream_iterator使用<<運算符,它格式化。)

其次,請注意,有不總是(在 大寫例如'ß'映射到兩個字符序列"SS")以一對一的翻譯的較低的 到上,所以std::transform不能真正用於正確地完成 工作。 (當然,它不能正確處理多字節編碼,如 UTF-8。)除了最簡單的用法之外,您需要更復雜的東西 。但即使是最簡單的情況:

std::toupper超載:重載的一個是一個模板,它 有兩個參數,另一個是一個函數,它接受一個 int;既不會直接在這裏工作,並且transform也是 也是一個模板,這意味着重載決議和模板類型 扣除即使他們這樣做也不起作用。所以基本上,你必須添加 的東西。如果您的 添加了足夠的限定符並使用boost::bind或類似的方式綁定 第二個參數,但可以使用2參數模板函數,但它幾乎與您自己寫入簡單的 toupper函數參數一樣多。而且你不能使用單 參數的形式,因爲它如果 您使用char作爲參數,當你調用它是未定義行爲(可以明確,如果你有 <ctype.h>和使用::toupper訪問):你必須轉換 charunsigned char首先(當然,除非你的代碼將被移植到的實現中,使用—和全部 實現中沒有未簽名的char爲 )。

+0

+1,但這實際上解決問題中的問題,而不是盲目地提出修改。對於使用'INT TOUPPER(INT)'你只需要在最後一個參數一個鑄件的簡單的解決方案:'的std ::變換(...,(INT(*)(INT))的std :: TOUPPER);' ,因爲這將解決重載問題:只有一個「toupper」超載可以被轉換爲特定的函數簽名。 – 2011-05-11 11:49:10

+0

@David問題是使用int toupper(int)會導致未定義的行爲;你不想直接使用它。 – 2011-05-11 12:04:47

相關問題