验证copy_if的返回值
Validate the return value of copy_if
我想检查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;
}
相关文章:
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 对fread的返回值感到困惑
- 如何避免使用多个if-else来检查返回值是否为错误代码?
- C++ |如何循环 If 语句而不每次都返回值
- 带有 if 语句的自动函数不会返回值
- 如何在 if 语句中正确使用 malloc() 返回值
- 编译器在发布中优化了我的部分代码,即使返回值被照顾并锁定到if语句