为什么iterator :: end()是非静态成员而不像string :: npos?

iam*_*ind 2 c++ iterator stl design-decisions

迭代一个std::mapstd::vector任何包含在其中的容器iterator时,会检查variable.end()而不是类似的东西container<>::end.例如,

map<int, int> var;
for(map<int, int>::iterator it = var.begin(); it != var.end(); it++)
...                                           ^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

上面突出显示的部分不能是这样的:

it != map<int,int>::end
Run Code Online (Sandbox Code Playgroud)

这与静态成员类似string::npos.设计决策背后提供.end()每个变量基础而不是每种类型的集装箱基地的原因是什么?(即map<int,int>::end并且map<int,double>::end会有所不同;但对于每个map<int,int>变量,它们::end都是相似的.)

ibi*_*bid 7

这样,一些基于数组的容器可以将迭代器简单地实现为指向元素的指针.对于每个数组,一个过去的最后一个元素指针是不同的.


Don*_*alo 5

考虑以下两个数组:

int a1[] = {2, 3, 4};
int a2[] = {5, 6, 7};
Run Code Online (Sandbox Code Playgroud)

过去两个数组的最后一个元素是不同的:

int *p1 = a1 + 3; // for a1
int *p2 = a2 + 3; // for a2
Run Code Online (Sandbox Code Playgroud)

您不能将一个指针用于另一个指针.没有通用常量来表示数组末尾.以下是错误的:

for (int *p = a1; p != a2; p++)
Run Code Online (Sandbox Code Playgroud)

end()对于相同类型的容器迭代器,没有相同的解释是类似的.