我使用轉換算法和std :: toupper來實現這一目標,但是可以在一行中完成,像這樣?將字符串轉換爲所有大寫字母與std :: transform
transform(s.begin(), s.end(), ostream_iterator<string>(cout, "\n"),std::toupper);
我得到這個錯誤,所以我必須做一個一元函數,這和把它與變換或我可以使用一些適配器?
我使用轉換算法和std :: toupper來實現這一目標,但是可以在一行中完成,像這樣?將字符串轉換爲所有大寫字母與std :: transform
transform(s.begin(), s.end(), ostream_iterator<string>(cout, "\n"),std::toupper);
我得到這個錯誤,所以我必須做一個一元函數,這和把它與變換或我可以使用一些適配器?
使用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
。
看到這些
首先,如果你想輸出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
訪問):你必須轉換 char
到unsigned char
首先(當然,除非你的代碼將被移植到的實現中,使用—和全部 實現中沒有未簽名的char
爲 )。
+1,但這實際上解決問題中的問題,而不是盲目地提出修改。對於使用'INT TOUPPER(INT)'你只需要在最後一個參數一個鑄件的簡單的解決方案:'的std ::變換(...,(INT(*)(INT))的std :: TOUPPER);' ,因爲這將解決重載問題:只有一個「toupper」超載可以被轉換爲特定的函數簽名。 – 2011-05-11 11:49:10
@David問題是使用int toupper(int)會導致未定義的行爲;你不想直接使用它。 – 2011-05-11 12:04:47
重要的是發佈您正在獲取的實際錯誤。特別是在對已接受答案的評論中,您已經添加了該錯誤,並且反過來說,問題是重載解決方案。在這一點上,所有的信息,人們可以清楚地解釋問題是什麼以及解決問題的方法,而不僅僅是一個解決方法,它不會幫助你解決下一個類似的問題(使用時的重載解析一個函數在模板中) – 2011-05-11 11:17:35
是的,我忘了錯誤,對不起 – Kobe 2011-05-11 11:31:44