c++ - 初始化列表与 vector

标签 c++ c++11 vector initialization initializer-list

在 C++11 中,可以使用初始化列表来初始化函数中的参数。它的目的是什么?不能用 const vector 做同样的事情吗?下面这两个程序有什么区别?

使用初始化列表:

#include <iostream>

using namespace std;

int sumL(initializer_list<int> l){
    int sum = 0;
    for (const auto i: l){
        sum += i;
    }
    return sum;
}

int main(){

    cout << sumL({1, 2, 3}) << "\n";

    return 0;
}

使用常量 vector :

#include <iostream>
#include <vector>

using namespace std;

int sumV(const vector<int> l){
    int sum = 0;
    for (const auto i: l){
        sum += i;
    }
    return sum;
}

int main(){

    cout << sumV({1, 2, 3}) << "\n";
    return 0;
}

最佳答案

std::initializer_list的常用用法作为容器(和类似)类的构造函数的参数,允许从相同类型的几个对象方便地初始化这些容器。 当然你可以用std::initializer_list否则,然后使用相同的 {}语法。

std::initializer_list具有固定大小,不需要动态分配,因此可以有效地实现。 std::vector ,另一方面,需要动态内存分配。即使在您的简单示例中,编译器也不太可能优化此开销(避免中介 std::vector 及其动态内存分配)。除此之外,您的程序的结果没有区别(尽管您应该使用 const std::vector<int>& 参数来避免复制及其相关的动态内存分配)。

关于c++ - 初始化列表与 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27753420/

相关文章:

c++ - 找到时替换字符串 vector 中的特定字符 C++

c++ - 我很困惑为什么在 C++ 中返回构造函数是合法的

c++ - 通过 "inorder"和 "reverse inorder"方法同时遍历二叉搜索树的多线程方法,比较元素对

c++ - 来自初始化列表的隐式类型转换在一种情况下编译但在另一种情况下不编译

r - 如何根据列表的长度拆分字符向量

c++ - 我的代码中出现 'base(const std::ios_base)' 是私有(private)错误。这有什么问题吗?

c++ - 使用头文件和cpp文件时如何定义结构?

以函数为参数的 C++ 函数模板取决于附加参数

c++ - C++ 中的模板问题

c++ - 将枚举类与 std::bitset 一起使用