我试图找到一个数组的绝对和。
#include <iostream>
#include <vector>
using namespace std;
int getAbsSum(vector<int> arr) {
int result = 0;
for (int i = 0; i < arr.size(); i++)
{
result += abs(arr[i]);
}
return result;
}
int main() {
cout << getAbsSum([3, 2, -3, -4]);
return 0;
}
但我在主函数中遇到了这样的错误消息:“ Expected an identifier”。我试图在数组之前添加一个类型名,像这样
cout << getAbsSum(int [3, 2, -3, -4]);
但它没有用。
的含义[ ]
不是您在示例中传达的含义。[]用于指示数组索引,并且仅支持一个参数。因此,3, 2, -3, -4
在此上下文中的表达式意味着求值3,然后求值2,然后是-3,然后是-4,然后返回求值-4的结果。看到
https://zh.cppreference.com/w/cpp/language/operator_other
因为表情3
,2
并-3
没有任何副作用,这里的结果是一样的,如果你只是写-4
。对于预期的标识符错误,operator [ ]
要求在其前面有一个变量,因此arr[1]
意味着返回数组(或容器)arr中的第二个对象。解决方案是对列表初始化使用正确的语法,这是统一初始化的一种形式(不要与用于聚合的聚合初始化混淆。向量不是聚合):
cout << getAbsSum({3, 2, -3, -4});
另外,我建议不要using namespace std;
在全局工作空间中使用,而只能在作用域受限的作用域内(即在函数内)使用。此功能的现代版本可以重写如下:
#include <iostream>
#include <vector>
#include <chrono>
template <typename E = int,
template <typename> typename T = std::vector>
E getAbsSum(T<E> const& arr){
E result {};
for (E element : arr)
{
result += abs(element);
}
return result;
}
int main() {
using namespace std;
using namespace std::literals;
cout << getAbsSum({3, 2, -3, -4}) << '\n';
cout << getAbsSum(vector<double>{2.3, 4.5, 6}) << '\n';
cout << getAbsSum(vector<chrono::seconds>{10s, 1min}).count() << '\n';
return 0;
}
此版本支持任何算术类型和任何容器。
回应@foodiecookies:
(1)在这里,该行E result {};
表示调用了E的默认构造函数。如果使用,E result = 0
则初始化会出错chrono::seconds
,但是如果使用E result
,则不会初始化算术类型,这是未定义的行为。E result {}
调用复杂类型的默认构造函数,基本类型的值设置为0或等效值(0.f,0.,false,...)。
(2)for (auto var : container)
是基于范围的循环。请参阅https://en.cppreference.com/w/cpp/language/range-for,它被认为更安全,更易于阅读。for(;;)
当您不遍历容器中的所有元素时,请使用旧的。
(奖金)由于参数依赖查找https://en.cppreference.com/w/cpp/language/adlabs(element)
找到了abs
函数的正确版本
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句