What is the past-the-end iterator in STL C++?

2020-01-28 03:35发布

Any one could explain me what is the meaning of past-the-end. Why we call end() function past-the-end?

标签: c++ stl
5条回答
家丑人穷心不美
2楼-- · 2020-01-28 04:15

Literally, because it points one past the end of the array.

It is used because that element is empty, and can be iterated to, but not dereferenced.

int arry[] = {1, 2, 3, 4, /* end */ };
                         ^^^^^^^
                    std::end(arry) would point here.
查看更多
别忘想泡老子
3楼-- · 2020-01-28 04:16

Because it doesn't point to the last element of a container, but to somewhere past the last element of a container.

If you dereference end() it results in undefined behaviour.

查看更多
Juvenile、少年°
4楼-- · 2020-01-28 04:32

The functions begin() and end() define a half open range([begin, end)), which means:
The range includes first element but excludes the last element. Hence, the name past the end.

enter image description here

The advantage of an half open range is:

  1. It avoids special handling for empty ranges. For empty ranges, begin() is equal to end() .

  2. It makes the end criterion simple for loops that iterate over the elements: The loops simply continue as long as end() is not reached

查看更多
5楼-- · 2020-01-28 04:36

Adding another point to the above correct answers. This was also done to be compatible with arrays. For example in the code below:

char arr[5];
strcpy(arr, "eakgl");
sort(&arr[0], &arr[5]);

This will work fine.

Instead if you had given :

sort(&arr[0], &arr[4]);

it would miss sorting the last character.

This also helps to represent empty containers naturally.

查看更多
手持菜刀,她持情操
6楼-- · 2020-01-28 04:39

Like interval in mathematics, stl uses [begin, end).

That's why we could write for (auto it = v.begin(); it != v.end(); ++it)

查看更多
登录 后发表回答