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

标签 c++ vector initialization

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/

相关文章:

c++ - 你如何让 python 识别读取预编译的共享文件?

c++ - 窃取cv::Mat的资源到IplImage

c++ - 不同类型 vector 的 vector

c++ - 3D vector 对象无法正常工作

c# - 在 .NET 中如何使用属性初始化 FormCollection?

c++ - 澄清 C++ 中的初始化

c++ - 在 Xcode 中链接库

c++ - 在windows上创建服务

c++ - 从私有(private) vector 公开访问和赋值运算符

c - 字符串文字是否算作部分初始化器和零初始化?