【问题标题】:C++ const_iterator to iterator for forward_listC++ const_iterator 到 forward_list 的迭代器
【发布时间】:2020-12-22 19:12:10
【问题描述】:

As per this question,并且假设我对容器本身有一个可变引用,可以使用 安全地 删除迭代器的常量:

foo::const_iterator cit = ... ;
foo::iterator it = c.erase( cit, cit );

但是,这似乎不适用于 forward_list 的等效项 erase_after,根据此代码::

#include <iostream>
#include <forward_list>

typedef std::forward_list<int>::const_iterator CIT;
typedef std::forward_list<int>::iterator IT;

int main()
{
    std::forward_list<int> m{1, 2, 3};

    CIT cit = m.begin();
    IT it = m.erase_after(cit, cit); // Segmentation fault!

    std::cout << *it;
}

那么有什么方法可以去除这个类的 const 迭代器的 const 性吗?最好不要通过迭代!

【问题讨论】:

标签: c++


【解决方案1】:

您遇到了分段错误,因为您违反了erase_after() 的前提条件,即(first, last) 传递给的范围

iterator erase_after(const_iterator first, const_iterator last);

应该是一个有效的范围。请注意,这是()-type of range,而不是[),因此两端都被排除在外。这就是为什么(cit, cit) 不是erase_after 的有效范围。

GCC 与 -D_GLIBCXX_DEBUG complains:

错误:函数需要一个有效的迭代器范围(__pos, __last)__pos 应在__last 之前且不等于__last

【讨论】:

    【解决方案2】:

    通过迭代,您可以这样做:

    IT it (m.begin());
    for ( CIT cit = m.begin(); cit != m.end(); ++cit )
    {
       std::advance (it, std::distance<CIT>(it, cit ) );
       // do changes on it
    }
    

    【讨论】:

      【解决方案3】:

      虽然我认为这很棘手,STL 应该提供一个正常的方法来做到这一点,insert_after 也有一个解决方案,因为:

      iterator insert_after(const_iterator position, size_type n, const T& x);
      

      前提条件:位置是before_­begin()或者是[begin(), end())范围内的可解引用迭代器。

      效果:在位置之后插入nx 副本。

      返回:一个迭代器,指向x 的最后插入副本,如果是n == 0,则指向位置。

      如果n == 0,则返回pos

      如果不想创建T的临时对象,可以使用:

      template<class InputIterator>
        iterator insert_after(const_iterator position, InputIterator first, InputIterator last);
      

      iterator insert_after(const_iterator position, initializer_list<T> il);
      

      并提供一个空序列或初始化列表。

      【讨论】:

      • @Evg他只想把const_iterator转换成iterator,为什么一定要erase_after?而事实上erase_after没有办法。
      猜你喜欢
      • 2011-12-07
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2021-02-11
      相关资源
      最近更新 更多