【发布时间】:2020-09-16 21:05:50
【问题描述】:
我有无法切换到迭代器的现有代码。 如果可能的话,我仍然想使用 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;
}
}
}
【问题讨论】:
-
从 C++11 开始,
std::begin(arr)和std::end(arr)给出了数组的开始和(过去)结束迭代器,可以传递给标准算法。std::rbegin()和std::rend()给出了相应的反向迭代器。这些函数适用于数组,而不是指针。 -
Is there a STL algorithm ... but that it also works on pointers?所有标准算法都使用指针。指针是迭代器。