2017-09-29 14 views
1

戻り値std::copy_ifが有効かどうかを確認したいと思います。このcopy_ifの戻り値を確認する

auto it=std::copy_if(s.begin(),s.end(),d.begin(),[&](...){...}); 
if([it]) // ???? 
{ 
    // do something 
} 
+3

あなたの質問は何ですか? 「それは最後にコピーされた要素を過ぎたもの」です。つまり、コピーした範囲は '[d.begin()、it)'となります。 – Pixelchemist

答えて

1

よう 何かがcopy_ifの戻り値は、先の範囲の「終わり過去1」をマークします。 copy_ifに範囲を渡した場合、すべてのコピー対象値を保持できるので、出力範囲の先頭からit - 1の間のすべての参照を解除することができます。

#include <vector> 
#include <algorithm> 
#include <iostream> 

int main() 
{ 
    std::vector<int> s{1,2,3,4,5,6,7,8,9,10}; 
    std::vector<int> d(10); 

    auto ce = std::copy_if(s.begin(),s.end(),d.begin(),[&](int x){ return x > 5; }); 

    for(auto i = d.begin(); i != ce; ++i) 
    { 
     std::cout << *i << "\n"; 
    } 
} 
0

@ Pixelchemistの回答の変形は、返されたイテレータからデスティネーションの最後までを消去することです。これにより、条件を満たす要素だけが残されます。

#include <vector> 
#include <algorithm> 
#include <iostream> 

int main() 
{ 
    std::vector<int> s{1,2,3,4,5,6,7,8,9,10}; 
    std::vector<int> d(10); 

    auto it = std::copy_if(s.begin(),s.end(),d.begin(),[&](int x){ return x > 5; }); 
    d.erase(it, d.end()); 

    for(int i : d) 
    { 
     std::cout << i << "\n"; 
    } 
} 
0

は最後にコピーした要素より1ポインタを戻します。したがって、あなたの場合、宛先範囲は[d.begin(), it)になります。

ないあなたがやりたいだろうが、あなたは、たとえばコピーされたどのように多くの要素を参照するためにポインタを使用することができ、エラーチェックの種類がわから:

unsigned int elementsCopied = it - d.begin(); 

ます。また、コピーされた要素を反復処理することができます。

for(auto i = d.begin(); i != it; ++i) 
{ 
    //perform action on i 
} 

あなたはまだcopy_ifの仕組みが分からない場合は、c++ referenceが私の意見ではっきりと説明しています。また、おそらく

面白い、これはあなたが何が起こっているか見ることができますcopy_ifの可能な実装である:

template <class InputIterator, class OutputIterator, class UnaryPredicate> 
    OutputIterator copy_if (InputIterator first, InputIterator last, 
         OutputIterator result, UnaryPredicate pred) 
{ 
    while (first!=last) { 
     if (pred(*first)) { 
      *result = *first; 
      ++result; 
     } 
     ++first; 
    } 
    return result; 
}