STL容器向前和向后行走
STL container to walk forwards and backwards
本文关键字:STL 更新时间:2023-10-16
作为一个基本问题,我正在寻找一个适合以下类型使用的STL容器:
1) 支持定期前向迭代
2) 支持从列表中间删除,同时向后浏览列表,以及
3) 如果某个东西在向后走的时候被删除了,我需要停下来向前走到列表的末尾。
我使用了一个常规的std::list
,发现从列表中的某个点向前走有点困难,但可行。我使用了正向和反向的组合,并设法避免使用advance
(因为这会很昂贵!)
这是我的密码。
#include <list>
using namespace std ;
int main()
{
list< int > os ;
os.push_back( 1 ) ;
os.push_back( 2 ) ;
os.push_back( 3 ) ;
os.push_back( 4 ) ;
os.push_back( 5 ) ;
// 1 2 3 4 5
// should print:
// 5: NOTHING
// 4: 5
// 3: 4,5
// 2: 3,4,5
// 1: 2,3,4,5
for( list<int>::reverse_iterator riter = os.rbegin() ; riter != os.rend() ; ++riter )
{
//printf( "All the ones in FRONT of %d are:n", riter->a ) ;
printf( "%d: ", *riter ) ;
// You can't do it with a for loop.
//for( list<O>::reverse_iterator iter = riter ; iter != os.rbegin() ; --iter )
list<int>::reverse_iterator iter = riter ;
if( iter != os.rbegin() ) do
{
--iter ; // move the iterator back.
printf( " %d", *iter ) ;
} while ( iter != os.rbegin() ) ;
//else printf( " NOTHING AFTER ME" ) ;
puts("");
}
}
我的问题是:
- 我是不是选错了集装箱?我应该使用
deque
吗 - 有没有办法在内部循环中使用
for
而不是do/while
考虑到您的要求,我认为您选择list
是好的(但它是std::list
,而不是stl::list
)。
从vector
的中间移除会使移除的元素之前的所有指针、引用和迭代器失效;从deque
的中间移除将使所有指针、引用和迭代器无效。
另一方面,从list
中删除保证只会使所删除元素的迭代器无效,因此,如果在删除元素时注意得当,则可以继续向前和向后迭代。
考虑到你的循环,我忍不住指出:
if (C) do { ... } while (C)
相当于更优雅(IMO):
while (C) do { ... }
相关文章:
- 没有找到相关文章