在 C++ 中,范围 for 循环用 begin() 和 end() 函数来定位容器的开头和结尾。因此,若想让自定义容器支持范围 for 循环,容器必须提供这两个函数。
实现 begin() 和 end() 的两种方式
要让你的容器支持 begin() 和 end() 有两种选择:
• 类内定义:直接在容器类内部实现 begin() 和 end(),这是最简单的方式。
class MyContainer {
public:
iterator begin() { return /* 起始位置 */; }
iterator end() { return /* 结束位置 */; }
};
• 命名空间内定义:如果不想在类里写这两个函数,可以在与容器相同的命名空间里定义独立的 begin() 和 end() 函数。
namespace MyNamespace {
class MyContainer {
// 容器的定义
};
iterator begin(const MyContainer& c) { return /* 起始位置 */; }
iterator end(const MyContainer& c) { return /* 结束位置 */; }
}
C++ 的参数依赖查找(ADL)机制要求:若 begin() 和 end() 是独立函数,必须和容器在同一命名空间,这样范围 for 循环才能找到它们。