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

时间:2018-08-18 18:23:10

标签: c++ vector initialization

借助Stackoverflow,我编写了一个输出矢量和的函数。我想问:

  • 为什么第一个版本有效,以及为什么第二个版本无效。 (找到答案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;
}

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

2 个答案:

答案 0 :(得分:1)

在定义没有初始化的内置类型的对象时,它将被默认初始化。但是,内置类型的默认初始化实际上没有任何作用!结果,读取未初始化的值是未定义的行为!您必须先对其进行初始化,然后才能从相应的对象读取它!

之所以出现这种奇怪的行为,是因为在两个相当重要的用例中需要用到它:

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

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

int sum_of_vec{};

答案 1 :(得分:0)

第二版格式错误。变量sum_of_vec未初始化,并且其值不确定。这可能导致不确定的行为。