范围for循环要求对象支持begin()和end(),以便获取迭代器进行遍历,适用于数组、标准容器等可迭代类型。

在C++11中,范围for循环(range-based for loop)只能用于“可迭代”的对象,也就是说,该对象必须支持
begin()
end()</)
对于具有已知大小的普通数组(即在作用域内定义的数组),范围for循环是可以使用的。
示例:
int arr[] = {1, 2, 3, 4, 5};
for (int x : arr) {
std::cout << x << " ";
}
这段代码是合法的。因为在数组的上下文中,编译器知道
arr
int[5]
begin(arr)
end(arr)
如果变量只是一个原始指针(例如通过
new
begin
end
立即学习“C++免费学习笔记(深入)”;
错误示例:
int* ptr = new int[5]{1, 2, 3, 4, 5};
for (int x : ptr) { // 编译错误!ptr是指针,不是数组
std::cout << x << " ";
}
这会引发编译错误,因为
ptr
int*
std::begin(ptr)
即使你定义了一个数组并传入函数,如果参数是按指针接收的,也会失去数组大小信息。
示例:
void func(int arr[]) { // 实际上等价于 int* arr
for (int x : arr) { // 编译错误!arr退化为指针
// ...
}
}
这种情况下,
arr
推荐使用标准容器或
std::array
std::array<int, 5> arr = {1, 2, 3, 4, 5};
for (int x : arr) {
std::cout << x << " ";
}
或者使用
std::vector
std::vector<int> vec = {1, 2, 3, 4, 5};
for (int x : vec) {
std::cout << x << " ";
}
基本上就这些。范围for循环对普通数组有效,但对原始指针无效,因为缺少迭代所需的边界信息。使用现代C++容器能避免这类问题。
以上就是C++11的范围for循环可以用于原始指针和数组吗的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号