".begin()和.end()的作用是什么?"

15
在C++库数组中,有哪些情况下使用`.begin()`和`.end()`成员函数是有用的?在cplusplus.com上,示例用法是遍历数组:
for ( auto it = myarray.begin(); it != myarray.end(); ++it )

但是

for (int i = 0; i < myarray.size(); i++)
可以用于那个。

4
begin()end() 可以用于 所有 STL 容器。 - dhke
6
没有它,你就无法在基于范围的for循环中使用它。 - NathanOliver
如果您使用普通数组,请坚持使用普通索引或指针。但是,一旦您使用C++标准库中的容器,您应该使用迭代器以便在所有容器中使用通用语法。 - Serge Ballesta
std::begin和std::end适用于std::array。 - James
更不用说end()经常被许多标准算法函数用作“未找到”值了。 - Banex
4个回答

26

begin()end() 返回的是迭代器。 迭代器提供了一种统一的语法来访问不同类型的容器。乍一看,它们可能看起来过于复杂,用于遍历一个简单的数组,但要考虑到你可以写相同的代码来遍历一个列表或映射。

这种对各种容器的统一访问将允许您编写可以在所有容器上工作而无需知道其内部结构的算法。 从开始到结束的for循环只是更大马赛克图案中的第一块。 只需查找标准算法列表,就能欣赏到这种简单抽象的强大威力。


10

标准容器的主要作用是可以更改它们并使用相同的语法。如果您有一个链表,第一种语法仍然适用。

此外,它等同于一个指针。 i 是一个索引,因此 myarray [i] 比它略慢。


2
更重要的是,具有相同的容器迭代语法意味着您可以编写适用于任何容器的模板。 - Jules
大多数关心的人指出差异微不足道。https://dev59.com/dHE85IYBdhLWcg3w9onw - Robert Jacobs

7

除了与其他容器通用外,beginend 还可用于 for range

for (const auto& e : myarray)

0

现在尝试遍历一个链表。唯一有效的方法是从一个项目迭代到下一个,直到达到末尾。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接