2011-04-30 123 views
5

是否可以比較兩個迭代器?一個比較使用std ::分鐘比較迭代器,C++

void change (typename TList <Item *>::Type ::iterator it_begin, typename TList <Item*>::Type ::iterator it_end) 
{ 
    .... 
this->items.resize (index); 
    std::sort (it_begin, std::min (it_end, it_begin += index - 1); //Compare two iterators, exception 
.... 
} 

拋出以下異常:

Assertion failed: Vector iterators incompatible... 

有比較談的任何其他方式?

+0

什麼類型'從TList :: Type'和'這個 - > items'的?迭代器是否指向'this-> items'? – 2013-08-28 18:21:34

回答

14

是的。但我懷疑你是否可以用std::min這樣做。

可以使用std::distance函數來計算兩個迭代器之間的距離。然後,您可以使用距離來確定哪個迭代器是較小的迭代器。一旦你知道了更小的迭代器,你可以將它傳遞給std::sort函數。

這裏是small illustration how to calculate distance

#include <iostream> 
#include <iterator> 
#include <vector> 

int main() { 
    std::vector<int> v(100); //vector of size 100 
    std::cout <<(std::distance(v.begin(), v.begin() + 10))<< std::endl; 
    std::cout <<(std::distance(v.begin() +25, v.begin() +10))<< std::endl; 
} 

輸出:

10 
-15 

希望給你足夠的想法如何繼續做你想要什麼。

+5

「然後,您可以使用距離來確定哪個迭代器是較小的一個。」假。 「如果最後一次從第一次不可達(可能重複)首先增加,則行爲是不確定的。」 – 2013-08-28 18:19:28

+0

我想你只會想這樣做,如果迭代器實際上是[隨機訪問迭代器](http://en.cppreference.com/w/cpp/concept/RandomAccessIterator)。因爲它們是支持比較操作的迭代器。 – Aleksei 2015-04-24 08:53:19

+1

Mooing Duck:在C++之前11。因爲C++ 11,它是 如果InputIt是RandomAccessIterator,如果最後一個從第一個不可達,而第一個不可從最後一個到達,則行爲是不確定的。 – xofon 2015-12-07 13:41:57

2

調用resize後,所有現有的迭代器是無效的。

此外,該行調用未定義的行爲,因爲你既改變it_begin並從中讀取,在一個不確定的順序。

1

在這本書中C++入門第五版。在第111頁3.4.2節迭代器算術說,

我們可以使用==和!=來比較有效的迭代器到任何庫容器中。

本節還告訴我們,對於迭代串和矢量支持關係運算符(又名迭代器算術),其包括>,> =,<,< =。