验证copy_if的返回值

时间:2017-09-29 10:59:34

标签: c++

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

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

3 个答案:

答案 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;
}