Chr*_*mer 10 c++ arrays iterator reverse-iterator
要使用POD元素搜索C-Array中元素的第一个出现,可以轻松实现std::find_if(begin, end, findit)
.但我需要最后一次出现.这个答案让我觉得这可以做到std::reverse_iterator
.因此,我试过:
std::find_if(std::reverse_iterator<podtype*>(end),
std::reverse_iterator<podtype*>(begin),
findit);
Run Code Online (Sandbox Code Playgroud)
这给了我错误:
无法在赋值时将'std :: reverse_iterator <xyz*>'转换为'xyz*'
您是否知道如何以这种方式进行操作或者您是否知道更好的解决方案?
这是代码:
#include <iostream>
#include <iterator>
#include <algorithm>
struct xyz {
int a;
int b;
};
bool findit(const xyz& a) {
return (a.a == 2 && a.b == 3);
}
int main() {
xyz begin[] = { {1, 2}, {2, 3}, {2, 3}, {3, 5} };
xyz* end = begin + 4;
// Forward find
xyz* found = std::find_if(begin, end, findit);
if (found != end)
std::cout << "Found at position "
<< found - begin
<< std::endl;
// Reverse find
found = std::find_if(std::reverse_iterator<xyz*>(end),
std::reverse_iterator<xyz*>(begin),
findit);
if (found != std::reverse_iterator<xyz*>(end));
std::cout << "Found at position "
<< found - std::reverse_iterator<xyz*>(end)
<< std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
tem*_*def 14
该std::find_if
函数的返回类型等于作为参数传入的迭代器类型.在您的情况下,由于您将std::reverse_iterator<xyz*>
s作为参数传递,因此返回类型将是std::reverse_iterator<xyz*>
.这意味着
found = std::find_if(std::reverse_iterator<xyz*>(end),
std::reverse_iterator<xyz*>(begin),
findit);
Run Code Online (Sandbox Code Playgroud)
不会编译,因为found
是xyz*
.
要解决此问题,您可以尝试这样做:
std::reverse_iterator<xyz*>
rfound = std::find_if(std::reverse_iterator<xyz*>(end),
std::reverse_iterator<xyz*>(begin),
findit);
Run Code Online (Sandbox Code Playgroud)
这将修复编译器错误.但是,我认为你在这一行中有两个次要错误:
if (found != std::reverse_iterator<xyz*>(end));
Run Code Online (Sandbox Code Playgroud)
首先,请注意if
语句后面有分号,因此if
无论条件是否为真,都将评估语句的主体.
其次,请注意,std::find_if
如果没有任何内容与谓词匹配,则将第二个迭代器作为标记返回.因此,这个测试应该是
if (rfound != std::reverse_iterator<xyz*>(begin))
Run Code Online (Sandbox Code Playgroud)
因为如果找不到元素find_if
将返回std::reverse_iterator<xyz*>(begin)
.
希望这可以帮助!
归档时间: |
|
查看次数: |
8027 次 |
最近记录: |