2016-09-29 4 views
6

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++標準の将来のバージョンで短縮することは可能でしょうか?

+4

"ハロー"'それはある意味タイプ 'のconstのchar [N]を'持ち変更できません。 – NathanOliver

+3

まず、Cの過去のもののために、 'std :: toupper'を' char'sに使うことはできません。 [詳細](https://stackoverflow.com/questions/21805674/do-i-need-to-cast-to-unsigned-char-before-calling-toupper) –

+2

を短くして、 "終了"イテレータなどを削除しながら、ほとんどの場合はそれほど冗長ではないかもしれませんが、そうでない場合は "削除"してください。オペレーションにイテレータの開始と終了を与えるので、C++は本当に柔軟でエレガントなことができます。 – Hayt

答えて

5

残念ながら、std::toupperには過負荷があるため、ラムダが回避策です。

その後、range-v3で、あなたはそれを簡略化することができます: `

あなたの最後の2つの例については
auto to_upper = [](unsigned char c) { return std::toupper(c); }; // To handle overloads 
std::cout << std::string("Hello world" | ranges::view::transform(to_upper)) 
      << std::endl; 

Demo

2
std::transform(s.begin(), s.end(), s.begin(), 
       [](unsigned char c) { return std::toupper(c); }); 

一般的なフォームが動作します。常に!

インプレースまたは別の結果に変換するときに使用できます。
std::transform(s.begin(), s.end(), result.begin(),...

これは、コンテナ全体または一部だけを変換することができます。お好みの任意の部分:
std::transform(s.begin() + i, s.begin() + j, s.begin() + i,...

そして、それは要素がコンテナの一部ではない場合でも、どの配列に動作します。

したがって、最も一般的な形式はとにかく必要です。最も有用な形式です。

+1

私は一般的な形式の必要性を理解しています。私は少なくとも他の形式がない理由を知ることに興味があります。 – Szabolcs

関連する問題