我有现有的代码,无法切换到迭代器。我仍然想尽可能地使用STL来找到最后一个项目(或者如果您认为我们是从末尾开始迭代的话)。有可能吗?
std :: find_end除了是最差的命名算法之外,似乎很难使用(我需要一个伪造的1元素序列和二进制谓词,在比较中忽略1元素的值)。
我现在所拥有的非常丑陋(尤其是因为bool *的反向不是bool *,所以我必须做些丑陋的事情才能获得std :: distance。
#include <algorithm>
#include <iostream>
int main()
{
{
bool arr[6] = {true,false,true,true,true,false};
auto e = std::make_reverse_iterator(&arr[0]);
auto b = std::make_reverse_iterator(&arr[6]);
auto it = std::find(b,e, false);
if (it!=e){
std::cout << "index of last false is " << &(*it) - &arr[0] << std::endl;
}
}
// repeat test to make sure result is not an accident
{
bool arr[6] = {true,false,true,true,false,true};
auto e = std::make_reverse_iterator(&arr[0]);
auto b = std::make_reverse_iterator(&arr[6]);
auto it = std::find(b,e, false);
if (it!=e){
std::cout << "index of last false is " << &(*it) - &arr[0] << std::endl;
}
}
}
我不确定我是否满足您的需求,但是这段代码似乎可以正常工作:
int arr[6] = { 1, 2, 3, 4, 5 };
int pattern[1] = { 4 };
auto it = std::find_end(arr, arr + 5, pattern, pattern + 1);