2017-10-19 3 views
0

私は、ローカルアドレスを解析する関数を見ています。返り値の選択肢の根拠に混乱しています。この関数は、私がのstd ::見つけるには_addressToCheck探しセットを通過するが、セットの最後のイテレータと比較背後にある理由は何ができる戻り値の実際のコードを理解この関数の戻り値でイテレータを使用する目的は何ですか?

bool p2p::isLocalHostAddress(bi::address const& _addressToCheck) 
{ 
    // @todo: ivp6 link-local adresses (macos), ex: fe80::1%lo0 
    static const set<bi::address> c_rejectAddresses = { 
     {bi::address_v4::from_string("127.0.0.1")}, 
     {bi::address_v4::from_string("0.0.0.0")}, 
     {bi::address_v6::from_string("::1")}, 
     {bi::address_v6::from_string("::")} 
    }; 

    return find(c_rejectAddresses.begin(), c_rejectAddresses.end(), _addressToCheck) != c_rejectAddresses.end(); 
} 

のですか?この場合、同じロジックは、セットの最後のイテレータと比較背後にある理由が何であるかを

return find(c_rejectAddresses.begin(), c_rejectAddresses.end(), _addressToCheck) != NULL; 
+1

おそらく、アイテムが見つからなかった場合、 'find'メソッドは終了イテレータを返します。 –

+0

[これはまさに 'std :: find()'の動​​作](http://en.cppreference.com/w/cpp/algorithm/find)です。最初のイテレーターから2番目のイテレーターまでを含む入力コンテナを検索します。アイテムが見つかった場合は、そのアイテムのイテレータが返されます。項目が見つからない場合は、2番目のイテレータが返されます。これにより、 'std :: find()'(および他のすべてのSTLアルゴリズム)がコンテナに依存しないようにすることができます –

+0

'NULL'の概念はイテレータにとって意味がありません。イテレータは、コンテナの有効な要素またはコンテナの 'end()'を指します。 –

答えて

3

として戻り値を一覧表示することで実装されていないでしょうか?

は、最初のイテレータから2番目のイテレータまでを含む2つのイテレータを入力として取ります。アイテムが見つかった場合は、アイテムのイテレータが返されます。項目が見つからない場合は、2番目のイテレータが返されます。 end()が2番目のイテレータとして渡されているので、アドレスが見つかったかどうかを知るには戻り値をend()と比較する必要があります。

は、このケースで同じロジックが

return find(c_rejectAddresses.begin(), c_rejectAddresses.end(), _addressToCheck) != NULL; 

として戻り値を一覧表示することで実装することはないでしょういいえ、それはないだろう。これは、std::find()がポインタ、または少なくとも0が「見つからない」ことを表す整数を返すことを意味します。これは多くのコンテナでは当てはまりません。 STLアルゴリズムはイテレータを使用するので、コンテナに依存しないことができます。

0

戻り値を他のアルゴリズム関数と互換性があるようにします。つまり、相互に埋め込むことができます。

auto found = find(list.begin(), list.end(), itemToFind); 

for_each(list.begin(), found, doSomething); 

潜在的に最も有用な例ではありません。しかし、必要に応じてイテレータを値から取得するよりもイテレータから値を取得するほうが簡単です。

関連する問題