![](/img/trans.png)
[英]forward_list::splice_after( const_iterator pos, forward_list& other, const_iterator i ) functionality
[英]C++ const_iterator to iterator for forward_list
根據這個問題,並假設我對容器本身有一個可變引用,則可以使用以下方法安全地刪除迭代器的常量性:
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迭代器的constness? 最好不是通過迭代!
您有一個分段錯誤,因為您違反了erase_after()
的前提條件,該前提條件指出范圍(first, last)
傳遞給
iterator erase_after(const_iterator first, const_iterator last);
應該是一個有效的范圍。 請注意,這是()
- 范圍的類型,而不是[)
,因此兩端都被排除在外。 這就是為什么(cit, cit)
不是erase_after
的有效范圍的原因。
帶有-D_GLIBCXX_DEBUG
GCC抱怨:
錯誤:函數需要一個有效的迭代器范圍
(__pos, __last)
,__pos
應在__pos
之前且不等於__last
。
雖然我認為這很棘手並且 STL 應該提供一種正常的方法來做到這一點,但insert_after
也有一個解決方案,因為:
iterator insert_after(const_iterator position, size_type n, const T& x);
前提條件:位置是
before_begin()
或者是[begin(), end())
范圍內的可解引用迭代器。效果:在位置后插入
x
n
副本。返回: 如果
n == 0
則指向x
或位置的最后插入副本的迭代器。
它返回pos
本身,如果n == 0
。
如果您不想創建T
的臨時對象,可以使用:
template<class InputIterator>
iterator insert_after(const_iterator position, InputIterator first, InputIterator last);
或者
iterator insert_after(const_iterator position, initializer_list<T> 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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.