2016-08-12 68 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