首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用反向迭代器调用erase

如何使用反向迭代器调用erase
EN

Stack Overflow用户
提问于 2009-12-02 09:41:10
回答 12查看 78.5K关注 0票数 213

我正在尝试这样做:

代码语言:javascript
运行
复制
for ( std::list< Cursor::Enum >::reverse_iterator i = m_CursorStack.rbegin(); i != m_CursorStack.rend(); ++i )
{
    if ( *i == pCursor )
    {
        m_CursorStack.erase( i );
        break;
    }
}

然而,erase需要一个迭代器,而不是反向迭代器。有没有一种方法可以将反向迭代器转换为常规迭代器,或者另一种方法将该元素从列表中删除?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2009-12-02 10:09:26

经过进一步的研究和测试,我找到了解决方案。显然,根据标准24.4.1/1,i.base()和I之间的关系是:

代码语言:javascript
运行
复制
&*(reverse_iterator(i)) == &*(i - 1)

(从Dr. Dobbs article):

因此,在获取base()时需要应用偏移量。因此,解决方案是:

代码语言:javascript
运行
复制
m_CursorStack.erase( --(i.base()) );

编辑

正在更新C++11。

reverse_iterator i保持不变:

代码语言:javascript
运行
复制
m_CursorStack.erase( std::next(i).base() );

reverse_iterator i是高级的:

代码语言:javascript
运行
复制
std::advance(i, 1);
m_CursorStack.erase( i.base() );

我发现这一点比我之前的解决方案要清晰得多。使用您需要的任何一个。

票数 202
EN

Stack Overflow用户

发布于 2010-09-28 08:33:21

请注意,如果在for循环中使用m_CursorStack.erase( (++i).base())可能会有问题(参见原始问题),因为它会更改i的值。正确的表达式是m_CursorStack.erase((i+1).base())

票数 16
EN

Stack Overflow用户

发布于 2018-05-11 05:57:59

有趣的是,这个页面上还没有正确的解决方案。因此,下面是正确的一条:

在前向迭代器的情况下,解决方案是直接的:

代码语言:javascript
运行
复制
std::list< int >::iterator i = myList.begin();
while ( i != myList.end() ) {
  if ( *i == to_delete ) {
    i = myList.erase( i );
  } else {
    ++i;
  } 
}

在使用反向迭代器的情况下,您需要执行相同的操作:

代码语言:javascript
运行
复制
std::list< int >::reverse_iterator i = myList.rbegin();
while ( i != myList.rend() ) {
  if ( *i == to_delete ) {
    i = decltype(i)(myList.erase( std::next(i).base() ));
  } else {
    ++i;
  } 
}

备注:

您可以从迭代器构造reverse_iterator

  • 您可以使用std::list::erase

的返回值

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

https://stackoverflow.com/questions/1830158

复制
相关文章

相似问题

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