This question already has answers here:
In which scenario do I use a particular STL container?
(10个回答)
6年前关闭。
有点基本问题,我正在寻找适合以下用途的STL容器:
1)支持定期向前迭代
2)支持从列表中间删除,同时向后浏览列表,以及
3)如果在向后走时删除了某些内容,我需要停下来并向前走到列表的末尾。
我使用常规的
这是我的代码。
我的问题是:
我对容器的选择不好吗?我应该使用
有没有办法在内部循环中使用
相当于更优雅(IMO):
(10个回答)
6年前关闭。
有点基本问题,我正在寻找适合以下用途的STL容器:
1)支持定期向前迭代
2)支持从列表中间删除,同时向后浏览列表,以及
3)如果在向后走时删除了某些内容,我需要停下来并向前走到列表的末尾。
我使用常规的
std::list
,发现从列表中的某个点向前走有点困难,但可行。我使用了forward和reverse_iterator的组合,并设法避免使用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 { ... }
09-25 15:16