vector_name、vector_name.begin() 和 (vector_name + vector_name.size())、vector_name.end() 有啥区别?

Posted

技术标签:

【中文标题】vector_name、vector_name.begin() 和 (vector_name + vector_name.size())、vector_name.end() 有啥区别?【英文标题】:What is the difference between vector_name, vector_name.begin() and (vector_name + vector_name.size()), vector_name.end()?vector_name、vector_name.begin() 和 (vector_name + vector_name.size())、vector_name.end() 有什么区别? 【发布时间】:2020-05-09 09:48:21 【问题描述】:

在这个Example中,他们使用*max_element(vector_name.begin(), vector_name.end());,而here,他们使用*max_element(vector_name, vector_name + 4);,但是当我使用*max_element(vector_name, vector_name.end());时,它会抛出这个错误:

no matching function for call to ‘max_element(std::vector<int>&, std::vector<int>::iterator)’
     max = *max_element(elements, elements.end());
                                                ^

现在,我知道vector_name 将地址存储到向量,而vector_name.begin() 返回一个迭代器,该迭代器将向量地址存储为其值,但我不明白到底有什么区别?

【问题讨论】:

如果v 是数组,你应该传递两个指针(v, v + 4),如果v 是向量,你应该传递两个迭代器(v.begin(), v.end())。不同之处在于你不能取消引用向量(你有迭代器),但你可以取消引用指针。 【参考方案1】:

在您的第一个示例中,vector_namestd::vector&lt;int&gt;

vector_name.begin()vector_name.end() 返回 std::vector&lt;int&gt;::iteratorstd::vector&lt;int&gt;::const_iterator,具体取决于 vector_name 是否为 const 限定。 vector_name + vector_name.size() 无效,除非您为 std::vector&lt;int&gt;std::size_t 定义 operator+

在他们使用*max_element(vector_name, vector_name + 4); 的第二个示例中,vector_name 是一个原始数组,可以衰减为指向其第一个元素的指针。而vector_name+4 指向第5 个元素(将第一个元素计为第1 个)。

【讨论】:

以上是关于vector_name、vector_name.begin() 和 (vector_name + vector_name.size())、vector_name.end() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章