gpt4 book ai didi

c++ - 需要一个标识符

转载 作者:行者123 更新时间:2023-12-01 14:35:46 24 4
gpt4 key购买 nike

我试图找到一个数组的绝对和。

#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;
}

但是我在我的主函数中收到了这个错误,上面写着“需要一个标识符”。我尝试在数组之前添加一个类型名,像这样

 cout << getAbsSum(int [3, 2, -3, -4]);

但它不起作用。

最佳答案

[ ] 的含义不是您在示例中所传达的。 [ ] 用于表示数组索引,它只支持一个参数。因此,此上下文中的表达式 3, 2, -3, -4 表示先计算 3,然后计算 2,然后计算 -3,再计算 -4,然后返回计算结果 -4。见

https://en.cppreference.com/w/cpp/language/operator_other

因为表达式32-3没有副作用,所以这里的结果和你写-4。关于预期标识符错误,operator [] 需要在其前面有一个变量,因此 arr[1] 表示返回数组(或容器)中的第二个对象arr。解决方案是使用正确的语法进行列表初始化,这是一种统一初始化的形式(不要与聚合初始化混淆,这是针对聚合的。 vector 不是聚合):

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(;;)

(bonus) abs(element) 借助 Argument Dependent Lookup 找到正确版本的 abs 函数 https://en.cppreference.com/w/cpp/language/adl

关于c++ - 需要一个标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63213170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com