2013-02-11 101 views
5

我真的很驚訝,看到std::count返回iterator_traits<InputIterator>::difference_type,而我的平臺上依次指​​long int爲什麼std :: count返回一個有符號的整數?

這是爲什麼?容器內的負數元素沒有任何意義。

+1

如果範圍無效,則差異將僅爲負數,並且在算法期間產生未定義的行爲。 – 2013-02-11 12:17:01

+0

此討論可能會有所幫助:http://stackoverflow.com/questions/7505083/why-does-the-c-standard-algorithm-count-return-a-ptrdiff-t-instead-of-size-t ?answertab =活動#tab-top – Jordan 2013-02-11 12:18:13

+0

@ChristianIvicvic,我很困惑。它是不是未定義的行爲?我的意思是,要麼檢查迭代器邊界,並且在錯誤時返回負值,要麼是未定義的行爲,然後返回的是未定義的。 – qdii 2013-02-11 12:19:35

回答

5

它實際上是一個std::ptrdiff_t,它必須是一個有符號的整數。它必須被簽名,因爲它可以被用作兩個迭代器之間的差異,當然這可能是負面的。

+0

+1。該死的我應該創造了一個答案,而不是一個評論......但是,是的,沒錯。 – 2013-02-11 12:19:19

+2

所以下一個問題是,爲什麼他們使用'std :: ptrdiff_t'作爲std :: count,並在另一篇文章中回答。那謝謝啦。 – qdii 2013-02-11 12:20:58

+1

@qdii'std :: iterator_traits :: difference_type'與迭代器'difference_type'相同,默認爲'ptrdiff_t'(例如[here](http://en.cppreference.com/w/cpp/)迭代器/迭代器)爲什麼距離被指定爲'ptrdiff_t'是_probably_,因爲迭代器可以像指針一樣使用,但(C++ 11)規範實際上並沒有給出原因,爲什麼,它只是指定它具有 – 2013-02-11 12:41:28

相關問題