2012-11-21 124 views
2

我有這樣一段代碼:迭代範圍與第一給出最後的迭代器

template<class Iter> 
void printRange(Iter begin, Iter last) { 
    for (Iter i = begin; i != last; i++) { 
     std::cout << *i << ", "; 
    } 
    outstd::cout << *last << ", "; 
} 

我的問題是:我怎麼能打印出最後一個元素,也優雅?循環播放最後一個元素似乎不是一個好的和正確的解決方案,有沒有更好的方法?請注意,我不能使用< =運算符或boost或任何stl特定功能。

+2

通常情況下,「最後」迭代器真的指向*過去*的最後一個元素,所以你的代碼可以正常工作並打印出每一個元素。你確定'last'也指向一個有效的元素嗎? – jalf

+0

是的,其實這不是我的代碼,我只是嘗試使用/修改它。如果它是*過去的*,我會稱它爲* end *,無論如何。 – WonderCsabo

+0

@jalf,當你用「find」找到你的迭代器並且你想用它們打印它們之間的所有內容時,我遇到了同樣的問題。 –

回答

2

您可以輸出分離條件:

template<class Iter> 
void printContainer(Iter first, Iter last) { 
    for (Iter i = first, end = ++last; i != end; i++) { 
     std::cout << (i == first ? "" : ", ") << *i; 
    } 
} 

對於更標準[begin, end)半開區間:

template<class Iter> 
void printContainer(Iter begin, Iter end) { 
    for (Iter i = begin; i != end; i++) { 
     std::cout << (i == begin ? "" : ", ") << *i; 
    } 
} 
+0

正如我已經在我的OP中所述,這是與真實*最後*元素,而不是*結束* *。但這是更好的解決方案,我同意。 – WonderCsabo

+0

@WonderCsabo啊,好的。我已經添加了兩個解決方案 – ecatmur

0

在STL中,最後一個迭代器沒有保存值,所以在這種情況下你的循環會起作用。

也許你應該考慮在列表的末尾添加另一個不包含任何值的迭代器,所以你會與STL保持一致。

4

對於STL容器類,迭代器值結束最後一項。一旦到達結束,它可以退出,因爲所有項目都已處理。

0

你可以這樣做:

template<class Iter> 
void printContainer(Iter begin, Iter last) { 
    Iter afterEnd = end; 
    afterEnd++; 
    for (Iter i = begin; i != afterEnd; i++) { 
     std::cout << *i << ", "; 
    } 
    outstd::cout << *last << ", "; 
} 

但是請注意,如果end被STL庫給出(如list.end()),它已經是最後一個元素後的值,並++會拋出異常。

所以我會用你擁有的代碼。但是當我打電話給它時,我將它的值傳遞給我想要打印的最後一個值。