验证copy_if的返回值

Validate the return value of copy_if

本文关键字:返回值 if copy 验证      更新时间:2023-10-16

我想检查std::copy_if的返回值是否有效。像这样的东西

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

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";
    }
}

@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";
    }
}

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 参考可以清楚地解释。

也许也很有趣,这可能是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;
}