Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;常量迭代器到前向列表的迭代器_C++ - Fatal编程技术网

C++ C++;常量迭代器到前向列表的迭代器

C++ C++;常量迭代器到前向列表的迭代器,c++,C++,,并且假设我有一个对容器本身的可变引用,,迭代器的常量可以使用以下方法安全地删除: foo::const_iterator cit = ... ; foo::iterator it = c.erase( cit, cit ); 但是,这似乎不适用于转发\u列表的等效项,即在之后擦除\u,根据以下代码: #include <iostream> #include <forward_list> typedef std::forward_list<int>::co

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

foo::const_iterator cit = ... ;
foo::iterator it = c.erase( cit, cit );
但是,这似乎不适用于
转发\u列表
的等效项,即
之后擦除\u,根据以下代码:

#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;
}
#包括
#包括
typedef std::forward_list::const_迭代器CIT;
typedef std::forward_list::迭代器;
int main()
{
转发列表m{1,2,3};
CIT-CIT=m.begin();
IT=m.erase_after(cit,cit);//分段错误!

std::cout您有一个分段错误,因为您违反了
erase\u after()
的先决条件,即范围
(第一个、最后一个)
传递给

iterator erase_after(const_iterator first, const_iterator last);
应为有效范围。请注意,这是
()
-类型的范围,而不是
[)
,因此两端都被排除在外。这就是为什么
(cit,cit)
不是
后擦除的有效范围

带有
-D_GLIBCXX_调试的GCC

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


虽然我认为这很棘手,STL应该提供一种正常的方法来实现这一点,但也有一种解决方案,即在
之后插入_,因为:

iterator insert\u after(常量迭代器位置、大小\u类型n、常量T&x);
先决条件:位置是u2; begin()
之前的
,或者是范围
[begin(),end())
中的可取消引用迭代器

效果:在位置后插入
n
x

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

如果
n==0
,则返回
pos
本身

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

模板
迭代器在后面插入(常量迭代器位置,先输入迭代器,后输入迭代器);

iterator insert\u after(常量迭代器位置,初始值设定项列表il);

并提供一个空序列或初始值设定项列表。

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

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
}
IT(m.begin());
对于(CIT-CIT=m.begin();CIT!=m.end();++CIT)
{
标准::前进(it,标准::距离(it,cit));
//对它进行更改
}

相关:@Evg他只想将
常量迭代器
转换为
迭代器
,为什么必须在
之后擦除?事实上不能通过
之后擦除。