gpt4 book ai didi

C++如何理解(auto & n : v)?

转载 作者:行者123 更新时间:2023-11-28 04:34:24 26 4
gpt4 key购买 nike

Stackoverflow的帮助下,我写了一个输出 vector 之和的函数。我想问:

  • 为什么第一个版本有效,为什么第二个版本无效。 (找到答案 here。)
  • 如何理解for (auto & n : v)?我理解像 for (auto ptr = v.begin(); ptr != v.end(); ptr++) 这样的代码,但是 1) 为什么我们传递 & n 而不是n?另外,:v 是什么?

谢谢!

// version 1 that works 
int sumVector(vector<int> v){
int sum_of_vec = 0;
for (auto &n: v){
sum_of_vec += n;
}
return sum_of_vec;
}

// version 2 that does not work
int sumVector(vector<int> v){
int sum_of_vec; // do not specify sum_of_vec = 0
for (auto &n: v){
sum_of_vec += n;
}
return sum_of_vec;
}

(原始问题包含可能重复的帖子未完全涵盖的两部分)

最佳答案

当定义一个没有初始化的内置类型的对象时,它将被默认初始化。但是,内置类型的默认初始化实际上什么都不做!因此,读取未初始化的值是未定义的行为!在您可以从相应的对象读取之前,它需要被初始化!

这种有点奇怪的行为的原因是两个相当重要的用例需要它:

  • 分配 [巨大] 对象数组时,它们通常会从某些来源接收非默认值,并且对它们进行值初始化会不必要地浪费时间。
  • 将对象构造到内存映射 I/O 区域时,可能根本无法写入相应位置,否则可能会产生不利影响。

为了支持这两种用例,对象内置类型在未指定任何内容时未初始化。给对象赋值很容易:只需指定一个值或值初始化对象,例如:

int sum_of_vec{};

关于C++如何理解(auto & n : v)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51911467/

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