2017-02-05 12 views
-5

にペアでイテレータの先頭にアクセスする私は2つのイテレータは、IEがあるペアを持っている:どのようにC++

auto trim = make_pair <std::string::iterator, std::string::iterator> 

と私は年末に第一イテレータの先頭を比較しようとしています2番目のイテレータ。

私はこのコード行を思い付いたが、プログラムがコンパイルされませんので、それは正しくないです。

if (begin(trim).first == end(trim).second) 

私もこのコード行を試してみましたが、それはまだエラー

if (begin(get<0>(trim)) == end(get<1>(trim))) 
を示し

エラー:

error: no matching function for call to ‘begin(std::pair<__gnu_cxx::__normal_iterator >, __gnu_cxx::__normal_iterator > >&)’

if (begin(trim).first == end(trim).second)

 ^

コンプリート例:

auto func(std::string& str, TrimPredicate p) -> 
std::pair< 
std::string::iterator, // typedef to string iterator type 
std::string::iterator // typedef to string iterator type 
> 
{ 
// Do stuff and return them as below 
return std::make_pair(first_non_ws_iter, last_non_ws_iter); 

} 

auto func2()-> std::pair<bool, string> { 

auto trimmed_range = func(
             line, 
             [loc](auto char_var) 
             { 
             return isspace(char_var, loc); 
             } 
             ); 


    if (begin(trimmed_range).first == end(trimmed_range).second) 
      //do something 
+2

イテレータはありませんが開始し、終了します。 –

+0

あなたはこれをやっている理由についてもう少し詳しく知ることができますか?近田はXY問題のように感じます。 –

+0

@NeilButterworth私は残念ですが、ここではC++を初めて使っていましたが、このコード行を書くように教授から指示されました: 'トリムの「開始」(最初の)イテレータが「終了」(2番目)のイテレータをトリムし、 (つまり、続行してください)。だから私は本当に今混乱しています – Suhaib

答えて

2

イテレータは、範囲を指定するためにペアで動作します。範囲には開始と終了があります。コンテナは範囲を作成する最も一般的な方法の1つです。コンテナには、それぞれコンテナの内容の先頭と最後を指すイテレータを返す、begin()end()というメンバ関数があります。 C++標準ライブラリには、コンテナと配列に適用して開始イテレータとエンドイテレータを取得するためのフリー関数std::beginstd::endも用意されています。

教授の文言に言及コメント教授はTイテレータ型であるstd::pair<T,T>ペアの最初の要素は、範囲の最初と第二の要素であると、範囲を指定することを慣例を適用していることを示唆しています終わりです。それは問題ありませんが、関数beginendには固有の接続がありません。

だからペアから開始と終了イテレータを取得する方法は、ペアの要素にアクセスするだけです:

if (trimmed_range.first == trimmed_range.second) 
    // do something