函数采用std :: initializer_list

时间:2019-08-19 05:13:32

标签: c++11 initializer-list

我遇到一个同事编写的一个函数,该函数接受std :: vectors的初始化列表。我已经简化了演示代码:

int sum(const std::initializer_list<std::vector<int>> list)
{
    int tot = 0;
    for (auto &v : list)
    {
        tot += v.size();
    }
    return tot;
}

这样的函数将允许您使用此类花括号调用初始化函数列表的函数:

std::vector<int> v1(50, 1);
std::vector<int> v2(75, 2);
int sum1 = sum({ v1, v2 });

这看起来很整洁,但是这不涉及复制向量以创建初始化列表吗?具有接受一个或多个向量的函数会更有效吗?由于可以移动矢量,因此复制量会减少。像这样:

int sum(const std::vector<std::vector<int>> &list)
{
    int tot = 0;
    for (auto &v : list)
    {
        tot += v.size();
    }
    return tot;
}

std::vector<std::vector<int>> vlist;
vlist.reserve(2);
vlist.push_back(std::move(v1));
vlist.push_back(std::move(v2));
int tot = sum2(vlist);

通过初始值设定项列表传递对于int和float等标量类型可能很有用,但我认为应避免对std :: vector之类的类型使用,以避免不必要的复制。最好按预期将std :: initializer_list用于构造函数?

1 个答案:

答案 0 :(得分:0)

  

看起来很整洁,但这不涉及复制向量以创建初始化列表吗?

是的,这是正确的。

  

拥有一个或多个矢量的函数会更有效吗?

如果您愿意将v1v2的内容移动std::vector<std::vector<int>>,则可以在使用std::initializer_list时执行相同的操作

std::vector<int> v1(50, 1);
std::vector<int> v2(75, 2);
int sum1 = sum({ std::move(v1), std::move(v2) });

换句话说,您可以使用任何一种方法来获得相同的效果。

相关问题