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