C++ 为什么boost filter_迭代器具有奇怪的make_filter_迭代器函数?

C++ 为什么boost filter_迭代器具有奇怪的make_filter_迭代器函数?,c++,boost,boost-iterators,C++,Boost,Boost Iterators,经过一番努力,我终于拼凑出了这个boost filter_迭代器的最小示例 using namespace std; std::function<bool(uint32_t)> stlfunc= [](uint32_t n){return n%3==0;}; int main() { vector<uint32_t> numbers{11,22,33,44,55,66,77,3,6,9}; auto start = boost::make_filter_ite

经过一番努力,我终于拼凑出了这个boost filter_迭代器的最小示例

using namespace std;
std::function<bool(uint32_t)> stlfunc= [](uint32_t n){return n%3==0;};
int main()
{
   vector<uint32_t> numbers{11,22,33,44,55,66,77,3,6,9};
   auto start = boost::make_filter_iterator(stlfunc, numbers.begin(), numbers.end());
   auto end   = boost::make_filter_iterator(stlfunc, numbers.end()  , numbers.end());
   auto elem  = std::max_element(start,end);
   cout << *elem;
}
使用名称空间std;
std::函数stlfunc=[](uint32_t n){返回n%3==0;};
int main()
{
向量数{11,22,33,44,55,66,77,3,6,9};
auto start=boost::生成过滤器迭代器(stlfunc,numbers.begin(),numbers.end());
auto end=boost::生成过滤器迭代器(stlfunc,numbers.end(),numbers.end());
自动元素=标准::最大元素(开始、结束);
cout这在以下章节中进行了解释:

跳过元件时,过滤器适配器必须 知道什么时候停止,以避免超过基础的结束 因此,过滤器迭代器由一对 指示未过滤序列中元素范围的迭代器 被穿越

从下面的源代码中,您可以看到“始终检查”是否已在
满足谓词中到达末尾:

void increment()
{
    ++(this->base_reference());
    satisfy_predicate();
}

void satisfy_predicate()
{
    while (this->base() != this->m_end && !this->m_predicate(*this->base()))
        ++(this->base_reference());
}
此外,正如
构造函数在传递结束迭代器时使其成为可选的,例如:
filter\u迭代器(迭代器x,迭代器end=iterator());
(假设它是默认可构造的)。因此,您可以省略
numbers.end()
在构造结束迭代器时使用您的代码。

如果查看
make\u filter\u迭代器
模板的声明,您会看到它如下所示:

template <class Predicate, class Iterator>
filter_iterator<Predicate,Iterator>
make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
模板
滤波器迭代器
生成过滤器迭代器(谓词f,迭代器x,迭代器end=iterator());
具体地说,您可以看到最后一个参数是默认参数,它被设置为
Iterator()
,这意味着它是默认构造的,对于某些类型的迭代器,它的行为类似于实际的
end()
Iterator,它指向任何数组的末尾,即指向垃圾


大多数容器类型确实需要传递一个实际的
end()
迭代器。

它还解释了如果基础迭代器是默认可构造的(并且代表您想要的范围的末尾),那么它是可选的。我很困惑…普通迭代器不知道何时停止,那么为什么过滤器迭代器应该停止呢?我的意思是,您不需要这样做(auto it=v.begin;it!=std::vector::iterator();++it)@nosenseal是不是应该增加一个
end
迭代器?@nosenseal:普通迭代器在使用
++
进行增量时不会跳过元素。好的,我现在明白了……因为for循环会被破坏,因为for循环在每个++之后都看到迭代器,aka++操作符看不到end,所以它会跳过它,并且它!=end永远不会为false
std::vector::const_iterator()!=std::vector::cend()
我不相信有任何保证标准库容器迭代器的默认构造等于结束迭代器。@DaveS您似乎是正确的,我已经适当地修改了我的答案。