减去 X.begin() 如何返回迭代器的索引?
Posted
技术标签:
【中文标题】减去 X.begin() 如何返回迭代器的索引?【英文标题】:How does subtracting X.begin() return the index of an iterator? 【发布时间】:2021-03-18 11:58:29 【问题描述】:无法理解以下代码:
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 返回的迭代器返回最大/最小元素的索引?
【问题讨论】:
你确定不是- X.begin()
?
这有什么不清楚的地方? (Paul 在旁边发现的错字。)
迭代器减法就像指针减法一样工作。 There are a number of useful operations you can perform on iterators(和指针)。 (我稍微简化了一点,因为有不同类型的迭代器,但vector
的迭代器是随机访问迭代器,所以我在此评论中关注这些类型的迭代器)。
注意错字。我只是有点困惑它如何从容器开头减去迭代器返回一个索引?从 min_element() 调用返回的迭代器减去向量开头的迭代器究竟是如何返回一个索引的?
没有魔法,迭代器只是为了支持这个减法运算符而设计的
【参考方案1】:
std::vector<T>::iterator
满足RandomAccessIterator concept,也就是说它有一个operator-
,可以让你减去两个迭代器,得到一个std::vector<T>::iterator::difference_type
,表示两个迭代器之间的距离。
std::vector<T>::iterator
的底层实现实际上可以使用指针作为迭代器来实现,在这种情况下,减法运算符只会进行指针运算。迭代器没有要求使用指针来实现,但这是一种潜在的设计。
其他容器的迭代器可能没有此功能。例如,std::set<T>::iterator
仅满足 BidirectionalIterator concept,它指定的功能集不如 RandomAccessIterator 概念丰富。
【讨论】:
以上是关于减去 X.begin() 如何返回迭代器的索引?的主要内容,如果未能解决你的问题,请参考以下文章