2009-01-22 24 views
2

我願做這樣的事情:的STL迭代器沒有初始化它

container::iterator it = NULL; 

switch (eSomeEnum) 
{ 
case Container1: 
it = vecContainer1.begin(); 
break; 

case Container2: 
it = vecContainer2.begin(); 
break; 
... 


} 

for(; it != itEnd ; ++it) 
{ 
.. 
} 

但我不能創建和初始化一個迭代爲NULL。有什麼辦法可以做到這一點?理想情況下,我只是在交換機中創建和分配迭代器,但是它會立即超出範圍。

回答

11

你根本不需要初始化它,因爲迭代器是DefaultConstructible。

6

所有你應該需要做的是改變

container::iterator it = NULL; 

container::iterator it; 

,我認爲如預期代碼將工作。

+0

的OP說,他不能這樣做,g ++以及鐺++不接受空比較或空的初始化。所以,AFAIK這是一個毫無意義的答案,你不應該發佈你「思考」的東西,因爲當它發現錯誤時會對整個社區造成危害。 – 2011-03-11 07:33:34

1

由於循環測試的結束,你應該構造它來估計什麼值爲itEnd

3

你實際上需要一個範圍,而不僅僅是開始迭代器。請注意,您不能比較來自不同容器的迭代器,因此最好選擇範圍,而不是迭代器。您可以使用Boost.Range來實現它:

#include <boost/range.hpp> 
#include <boost/foreach.hpp> 

boost::iterator_range<container::iterator> r; 
switch(e) 
{ 
    case Container1: 
     r = boost::make_iterator_range(vecContainer1); 
    break; 

    case Container2: 
     r = boost::make_iterator_range(vecContainer2); 
    break; 

    ... 
} 

BOOST_FOREACH(container::value_type value, r) 
{ 
    ... 
}