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他只想将常量迭代器
转换为迭代器
,为什么必须在之后擦除?事实上不能通过在之后擦除。