我想检查std::copy_if
的返回值是否有效。
像这样的东西
auto it=std::copy_if(s.begin(),s.end(),d.begin(),[&](...){...});
if([it]) // ????
{
// do something
}
答案 0 :(得分:1)
copy_if
的返回值标志着"一个结束的时间"目的地范围。如果您将范围传递到可以容纳所有待复制值的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";
}
}
答案 1 :(得分: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";
}
}
答案 2 :(得分:0)
copy_if
返回一个指针,它超过了上次复制的元素。因此,在您的情况下,目标范围将是[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;
}