2016-08-12 69 views
1

唔明下面的代碼:減法X.begin()如何返回迭代器的索引?

int data[5] = { 1, 5, 2, 4, 3 }; 
vector<int> X(data, data+5); 
int v1 = *max_element(X.begin(), X.end()); // Returns value of max element in vector 
int i1 = min_element(X.begin(), X.end()) – X.begin(); // Returns index of min element in vector 

不是真的知道如何減去X.begin返回的迭代器返回的最大/最小元素的索引?

+2

你確定它不是' - X.begin()'? –

+1

什麼不清楚? (保羅錯過的拼寫錯誤。) –

+0

迭代器減法的作用就像指針減法一樣。 [你可以在迭代器上執行許多有用的操作](http://en.cppreference.com/w/cpp/concept/RandomAccessIterator)(和指針)。 (我簡化了一些,因爲有不同類型的迭代器,但'vector'的迭代器是隨機訪問迭代器,所以我將注意力集中在這個評論中的那些類型的迭代器)。 – Cornstalks

回答

5

std::vector<T>::iterator滿足RandomAccessIterator concept,這意味着它有一個operator-,允許你減去兩個迭代和獲得std::vector<T>::iterator::difference_type指示兩個迭代之間的距離。

std::vector<T>::iterator的底層實現實際上可以使用指針作爲迭代器來完成,在這種情況下,減法運算符只是做指針運算。對於要使用指針實現的迭代器,沒有要求,但它是一個潛在的設計。

其他容器的迭代器可能沒有這個能力。例如,std::set<T>::iterator只能滿足BidirectionalIterator concept,它指定比RandomAccessIterator概念更少豐富的功能集。

+0

非常感謝你,你和Cornstalks鏈接都清除了這個。第一次使用它們,並沒有意識到不同的迭代器有不同的操作符返回值等。 – jameshelou