首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >迭代到第二个最后元素的C++方法

迭代到第二个最后元素的C++方法
EN

Stack Overflow用户
提问于 2017-04-07 06:39:01
回答 4查看 2.3K关注 0票数 2

我正试图迭代一遍,直到排除最后一项。理想情况下,我会避免计算和比较长度,所以我尝试

代码语言:javascript
运行
复制
    auto it_end = dq.rbegin(); it_end++;
    for ( auto it = dq.begin(); it !=it_end; ) {
        if ( cond() ) {
            it = dq.erase( it );
        } else {
            it++;
        }
    }

但是编译器抱怨没有匹配的操作数,这似乎可以理解,因为我有一个反向迭代器和一个常规迭代器。在避免计数的最后一个元素之前,是否有一种优雅的方式来停止?就像,补偿?我也尝试过返回,但结果是引用而不是迭代器,所以!=也不高兴。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-04-07 06:53:08

您可以使用dq.end() - 1在结束前获得一个。

您还可以使用std::removestd::remove_if来删除您想要的项,而不是自己完成工作。注意,这基本上有点像分区操作--它返回一个迭代器,您想要保存的所有东西都是从范围的开始到那个迭代器。您要删除的所有内容都是在该迭代器之后,到您作为输入提供的范围的末尾。

在这种情况下,您可以按照一般顺序做一些事情:

代码语言:javascript
运行
复制
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 << ", ";
票数 5
EN

Stack Overflow用户

发布于 2017-04-07 06:57:04

来自std::deque::erase

所有迭代器和引用都无效,除非擦除的元素位于容器的末尾或开头,在这种情况下,只有迭代器和对擦除元素的引用无效。

这意味着,您不能使用迭代器和删除某些元素来迭代deque。相反,将std::remove_ifstd::deque::erase结合使用。

(未经测试,但你会有个主意)

代码语言:javascript
运行
复制
std::deque<T> dq = /* ... */;
auto from = std::remove_if(dq.begin(), std::prev(dq.end()),
    [](decltype(dq)::const_reference, decltype(dq)::const_reference){ return cond(); }
);
dq.erase(from, std::prev(dq.end()));
票数 1
EN

Stack Overflow用户

发布于 2017-04-07 06:44:25

这个怎么样:

代码语言:javascript
运行
复制
deque dq;
//fill it
for(int i = 0; i < dq.size() - 1; i++) //notice the "-1" to avoid reaching the last element
{
    if ( cond() ) 
    {
        dq.erase(dq.begin()+i);
        i--;
    } 
}

您可以使用deque访问operator[]元素,因此dq[i]是deque的元素号i

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43271285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档