2014-10-19 41 views
1

我試過在C++ STL Map中使用lowerbound()。在我使用它,我通過程序像下面測試其功能:C++ map lowerbound()

int main() 
{ 
    std::map<int,int> mymap; 
    std::map<int,int>::iterator itlow; 

    mymap[1]=20; 
    mymap[3]=60; 
    mymap[4]=80; 
    mymap[5]=100; 

    itlow=mymap.lower_bound (2); 

    //Test1 
    std::cout<<(--itlow)->first<<'\n'; //print 1 
    std::cout<<itlow->second<<'\n'; //print 20 

    //Test2 
    std::cout<<(--itlow)->first<<": "<<itlow->second<<'\n'; //print 1 : 60   
} 

我單獨測試1和2,當我測試1,這意味着,我評論的Test2和相同的反向。 測試1的結果符合我的預期,但我不明白爲什麼Test2會打印第二個字段而不是20個字段?

+0

測試2有未定義的行爲。 – chris 2014-10-19 19:21:22

+1

請問你能具體嗎?謝謝! – diane 2014-10-19 19:22:57

+0

[見這裏](http://stackoverflow.com/questions/949433/why-are-these-constructs-undefined-behavior)許多這樣的例子。還有[this](http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points?rq=1)。 – chris 2014-10-19 19:23:52

回答

2

未指定(--itlow)->first是在itlow->second之前還是之後評估的。如果之前評估過,則獲得20;否則,你得到60

參見order of evaluation of operands

+0

您無法讀取和寫入序列點之間的'itlow'「。 – chris 2014-10-19 19:25:27

+0

@chris:你說這是未定義的而不是未指定的? – NPE 2014-10-19 19:27:12

+0

好吧,我想如果[SO](http://stackoverflow.com/questions/3690141/multiple-preincrement-operations-on-a-variable-in-cc/3691469#3691469)是相信的,它是預先-C++ 11而不是之後。事物如何巧妙地改變總是很有趣。 – chris 2014-10-19 19:28:00