C++ deque迭代到倒数第二个元素

chr*_*ise 2 c++

我试图迭代一个双端队列以排除最后一个条目.理想情况下,我会避免计算和比较长度,所以我试过

    auto it_end = dq.rbegin(); it_end++;
    for ( auto it = dq.begin(); it !=it_end; ) {
        if ( cond() ) {
            it = dq.erase( it );
        } else {
            it++;
        }
    }
Run Code Online (Sandbox Code Playgroud)

但编译器抱怨没有匹配操作数,这似乎是可以理解的,因为我有一个反向迭代器和一个常规迭代器.是否有一种优雅的方法可以在最后一个避免计数的元素之前停止?像,偏移?我也试过回来了,但结果却是一个参考而不是迭代器,所以!=也不开心.

Jer*_*fin 5

您可以dq.end() - 1在结束前使用它.

您也可以使用std::removestd::remove_if删除所需的项目,而不是自己完成工作.请注意,这基本上类似于分区操作 - 它返回一个迭代器,您要保留的所有内容都是从范围的开头到迭代器.您要删除的所有内容都在该迭代器之后,直到您作为输入提供的范围的末尾.

在这种情况下,您可以对此常规订单执行某些操作:

std::deque<int> vals { 1, 2, 3, 4, 5, 6, 7, 8};

// get an iterator one before the end of `vals`
auto end = vals.end()-1;

// remove the even items in the range (so all except `8`)
auto pos = std::remove_if(vals.begin(), end, 
    [](int v){ return v %2 == 0;} 
);

// erase the items we just "removed"
vals.erase(pos, end);

// show the result
for (v : vals)
    std::cout << v << ", ";
Run Code Online (Sandbox Code Playgroud)