戻り値std::copy_if
が有効かどうかを確認したいと思います。このcopy_ifの戻り値を確認する
auto it=std::copy_if(s.begin(),s.end(),d.begin(),[&](...){...});
if([it]) // ????
{
// do something
}
戻り値std::copy_if
が有効かどうかを確認したいと思います。このcopy_ifの戻り値を確認する
auto it=std::copy_if(s.begin(),s.end(),d.begin(),[&](...){...});
if([it]) // ????
{
// do something
}
よう 何かが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";
}
}
@ 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";
}
}
は最後にコピーした要素より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;
}
あなたの質問は何ですか? 「それは最後にコピーされた要素を過ぎたもの」です。つまり、コピーした範囲は '[d.begin()、it)'となります。 – Pixelchemist