C++ 需要一个标识符

C++ 需要一个标识符,c++,C++,我试图找到数组的绝对和 #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;

我试图找到数组的绝对和

#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;
}
#包括
#包括
使用名称空间std;
int getAbsSum(向量arr){
int结果=0;
对于(int i=0;i
cout << getAbsSum({3, 2, -3, -4});

<代码> c> <> >代码> [/COD] >括号内没有使用类似的C++。您似乎想使用,使用<代码> {} /代码>代替:

cout << getAbsSum({3, 2, -3, -4});

cout示例中所表达的不是
[]
的含义。[]用于表示数组索引,并且它只支持一个参数。因此,此上下文中的表达式
3,2,-3,-4
意味着计算3,然后计算2,然后计算-3,然后返回计算-4的结果。请参阅

因为表达式
3
2
-3
没有副作用,所以这里的结果与您刚刚编写的
-4
相同。 关于预期的标识符错误,
运算符[]
需要在其前面加一个变量,因此
arr[1]
意味着返回数组(或容器)arr中的第二个对象。 解决方案是对列表初始化使用正确的语法,这是一种统一的初始化形式(不要与聚合初始化混淆,聚合初始化用于聚合。向量不是聚合):

此版本支持任何算术类型和任何容器

针对@foodiecookies:

(1) 这里,行
E result{};
意味着调用了E的默认构造函数。如果使用
E result=0
,则初始化
chrono::seconds
时会出现错误,但如果使用
E result
,算术类型将不会初始化,这是未定义的行为。
E result{}
对复杂类型调用默认构造函数,对基本类型调用值0或等效值(0.f,0.,false,…)

(2)
for(auto-var:container)
是一个基于范围的循环。请参阅 它被认为更安全、更易于阅读。当您没有迭代容器中的所有元素时,请使用旧的
for(;;)

(额外)
abs(element)
通过依赖于参数的查找来查找
abs
函数的正确版本

这不是C++语法。试试<代码> GETABSUM({ 3, 2,3,-4 });< /代码>非常感谢!你好,我可以问你2个关于你重写的代码的问题吗?1。‘我见过不少人在for循环中使用冒号而不是分号。你介意解释一下这行代码的作用吗?谢谢!@foodiecookies我编辑了答案,包括一个带有时间段的用例,并在最后一段中回答了你的问题。……非常感谢!
cout << getAbsSum({3, 2, -3, -4});
cout << getAbsSum({3, 2, -3, -4});
#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;
}