2013-05-02 95 views
1

如果映射中只有單個元素,std :: map迭代器遞減應該返回什麼?這裏的示例代碼std :: map :: iterator單個元素遞減

#include <map> 
#include <stdio.h> 
int main() 
{ 
    std::map<int, int> m; 
    m.insert(std::make_pair(1, 1)); 
    //std::map<int, int>::iterator it = m.begin(); 
    std::map<int, int>::iterator it = m.upper_bound(0); 
    printf("isbegin: %d\n", it == m.begin()); 
    --it; 
    bool isend = it == m.end(); 
    printf("isend: %d\n", isend); 
} 

在Windows上,將打印isend:1,在Linux上使用g ++ 4.6將isend打印:0

問題:是上面UB的真正情況下減量?如果不是,那麼結果是正確的 - Windows還是Linux?

UPDATE:修改後的代碼表明UPPER_BOUND被稱爲

+0

請參閱http://stackoverflow.com/questions/8533875/substraction-or-decrement-random-access-iterator-pointing-to-begin – Nick 2013-05-02 09:51:26

+0

那麼,在真正的應用程序中,迭代器從upper_bound()返回,那麼相關Q仍然適用? – queen3 2013-05-02 09:53:32

回答

6

遞減東西元素開始前()沒有意義。這是未定義的行爲,並且沒有正確或不正確的答案。

+0

在真正的應用程序中,迭代器是從upper_bound返回的,所以遞減「某個迭代器」是非法的,直到我們檢查它不等於begin()? – queen3 2013-05-02 09:54:46

+0

這不是「非法」,但未定義。但是,是的,你應該始終確保你不會遞減指向開始的指針()。如果你這麼做了,即使你增加它開始(),你也不能保證會發生什麼, – olevegard 2013-05-02 09:58:25

2

一個迭代器r操作--r如果操作完成之前存在s,從而r == ++s和完成操作後r是提領是有效的。 (§24.2.6Bidirectional.iterators)

由於開始()返回一個迭代到容器的第一個元素不存在元件s它可以遞增去r所以這是不明確的。