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_name
是 std::vector<int>
vector_name.begin()
和 vector_name.end()
返回 std::vector<int>::iterator
或 std::vector<int>::const_iterator
,具体取决于 vector_name
是否为 const 限定。
vector_name + vector_name.size()
无效,除非您为 std::vector<int>
和 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() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章