我遇到一个同事编写的一个函数,该函数接受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用于构造函数?
答案 0 :(得分:0)
看起来很整洁,但这不涉及复制向量以创建初始化列表吗?
是的,这是正确的。
拥有一个或多个矢量的函数会更有效吗?
如果您愿意将v1
和v2
的内容移动到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) });
换句话说,您可以使用任何一种方法来获得相同的效果。