c++ - 编译错误:循环遍历 C++ 函数中数组的每个元素
问题描述
我是 C++ 新手,我尝试在 C++ 函数中循环遍历数组的每个元素,但出现编译时错误。有人可以解释为什么会这样吗?
这是我的代码:
#include <iostream>
int getMax(int arr[])
{
int max = arr[0];
for (int x: arr){
if ( x > max ) max = x;
}
return max;
}
int main()
{
int arr[] = {4,2,5,3,6,8,1};
int max = getMax(arr);
std::cout << max << std::endl;
return 0;
}
这是错误消息:
get_max.cpp: In function 'int getMax(int*)':
get_max.cpp:6:17: error: 'begin' was not declared in this scope
for (int x: arr){
^
get_max.cpp:6:17: note: suggested alternative:
In file included from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/string:51:0,
from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/bits/locale_classes.h:40,
from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/bits/ios_base.h:41,
from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/ios:42,
from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/ostream:38,
from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/iostream:39,
from get_max.cpp:1:
C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/bits/range_access.h:87:5: note: 'std::begin'
begin(_Tp (&__arr)[_Nm])
^
get_max.cpp:6:17: error: 'end' was not declared in this scope
for (int x: arr){
^
get_max.cpp:6:17: note: suggested alternative:
In file included from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/string:51:0,
from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/bits/locale_classes.h:40,
from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/bits/ios_base.h:41,
from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/ios:42,
from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/ostream:38,
from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/iostream:39,
from get_max.cpp:1:
C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/bits/range_access.h:97:5: note: 'std::end'
end(_Tp (&__arr)[_Nm])
解决方案
您必须通过引用传递数组以保留大小信息:
template <std::size_t N>
int getMax(const int (&arr)[N])
{
int max = arr[0];
for (int x: arr){
if ( x > max ) max = x;
}
return max;
}
否则你必须用指针传递大小。
int getMax(const int *arr, std::size_t size)
{
assert(arr != nullptr);
assert(size != 0);
return *std::max_element(arr, arr + size);
}
using std::vector
/std::array
有更自然的语法。
int getMax(const std::vector<int>& arr)
{
assert(!arr.empty());
#if 1
return *std::max_element(arr.begin(), arr.end());
#else
int max = arr[0];
for (int x: arr){
if ( x > max ) max = x;
}
return max;
#endif
}
int main()
{
const std::vector<int> arr{4,2,5,3,6,8,1};
const int max = getMax(arr);
std::cout << max << std::endl;
}
推荐阅读
- dart - 有什么作用?。准确检查?
- npm - 为什么某些依赖项无法使用 npm 安装,而是使用 bower 安装,反之亦然
- json - 在 SQL Server 2016 中返回带有列名的 JSON
- logstash - 使用 logstash grok 过滤器屏蔽一部分信用卡号
- java - 在扫描仪验证中将输入键视为无效
- git - git reset --soft 是否只更改哈希值?
- elasticsearch - 字段的弹性搜索连接
- mysql - 无法使用ansible创建mysql数据库
- php - 进行另一个选择时如何清除所选文本?
- sql-server - 在同一个查询中从两个表中加载数据