Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C样式数组上使用find_if和reverse_迭代器?_C++_Arrays_Iterator_Reverse Iterator - Fatal编程技术网

C++ 如何在C样式数组上使用find_if和reverse_迭代器?

C++ 如何在C样式数组上使用find_if和reverse_迭代器?,c++,arrays,iterator,reverse-iterator,C++,Arrays,Iterator,Reverse Iterator,要使用POD元素搜索C数组中第一个出现的元素,可以使用std::find_if(begin,end,findit)轻松完成。但我需要最后一次机会。给我的想法是,这可以通过std::reverse\u迭代器来完成。因此,我尝试: std::find_if(std::reverse_iterator<podtype*>(end), std::reverse_iterator<podtype*>(begin), findit)

要使用POD元素搜索C数组中第一个出现的元素,可以使用
std::find_if(begin,end,findit)
轻松完成。但我需要最后一次机会。给我的想法是,这可以通过
std::reverse\u迭代器来完成。因此,我尝试:

std::find_if(std::reverse_iterator<podtype*>(end),
             std::reverse_iterator<podtype*>(begin),
             findit);
std::find_if(std::reverse_迭代器(end),
标准::反向迭代器(开始),
findit);
这给了我一个错误:

无法将赋值中的“std::reverse_迭代器”转换为“xyz*”

你有办法这样做吗?或者你知道更好的解决办法吗

代码如下:

#包括
#包括

#如果
函数的返回类型等于作为参数传入的迭代器类型,则包含
std::find_。在本例中,由于您将
std::reverse_iterator
s作为参数传递,因此返回类型将是
std::reverse_iterator
。这意味着

found = std::find_if(std::reverse_iterator<xyz*>(end),
                     std::reverse_iterator<xyz*>(begin),
                     findit);
这将修复编译器错误。但是,我认为这一行中存在两个次要错误:

if (found != std::reverse_iterator<xyz*>(end));
因为如果未找到元素,
find\u if
将返回
std::reverse\u迭代器(begin)


希望这有帮助

是的,这很有用,谢谢。现在返回的索引在这两种情况下都是1,这似乎是正确的,但如果反向查找的结果将给出2的索引,那就太好了。我不能从
rfound
中减去
begin
,因为这会导致与以前相同的错误。@ChristianAmmer-我认为这是因为您获取索引的逻辑是错误的。减法计算从反向迭代器到数组最后一个元素的距离,它给出了从数组后面到前面的距离,我想我现在知道了。逻辑错误,但是使用
(end-begin)-(rfound-std::reverse_iterator(end))-1
我得到了正确的索引。
if (found != std::reverse_iterator<xyz*>(end));
if (rfound != std::reverse_iterator<xyz*>(begin))