STL関数への呼び出しをもっと簡単にできないのはなぜですか?私はcppreference.com上で、次のコードスニペットを見ていた:C++ STL関数呼び出しを冗長にする必要があるのはなぜですか?
#include <string>
#include <cctype>
#include <algorithm>
#include <iostream>
int main()
{
std::string s("hello");
std::transform(s.begin(), s.end(), s.begin(),
[](unsigned char c) { return std::toupper(c); });
std::cout << s;
}
この呼び出しは、より簡単に作ることが可能であるべきであるように私には思えます。最初の明白なことは、ラムダを取り除くことです:
std::string s("hello");
std::transform(s.begin(), s.end(), s.begin(), std::toupper);
std::cout << s;
これは機能しません。で
std::string s("hello");
std::cout << std::transform(s, std::toupper);
:値で結果を返すために
std::string s("hello");
std::transform(s, s.begin(), std::toupper);
std::cout << s;
あなたはまた、出力イテレータを省略することができます:あなたは通常、容器全体を変換したいので、それだけでパラメータとしてことを使用することが可能ですこの時点一時変数は不要です:追加可読性と
std::cout << std::transform("hello"s, std::toupper);
:
using namespace std;
cout << transform("hello"s, toupper);
これはわかりやすく、ちょっといいですか?なぜSTL関数はこのような短いコードを書くことができるように設計されていませんでしたか?これらの呼び出しをC++標準の将来のバージョンで短縮することは可能でしょうか?
"ハロー"'それはある意味タイプ 'のconstのchar [N]を'持ち変更できません。 – NathanOliver
まず、Cの過去のもののために、 'std :: toupper'を' char'sに使うことはできません。 [詳細](https://stackoverflow.com/questions/21805674/do-i-need-to-cast-to-unsigned-char-before-calling-toupper) –
を短くして、 "終了"イテレータなどを削除しながら、ほとんどの場合はそれほど冗長ではないかもしれませんが、そうでない場合は "削除"してください。オペレーションにイテレータの開始と終了を与えるので、C++は本当に柔軟でエレガントなことができます。 – Hayt