如何将空向量提升为一个默认元素的向量?

时间:2018-03-06 01:23:20

标签: c++

今天我有这个:

std::vector<Foo> foos = GetFoos();
if (foos.empty())
{
    foos.push_back(Foo());
}

我喜欢写下这样的文章:

std::vector<Foo> foos = GetFoos() || {Foo()};

是否有类似的东西,也许在Boost中?

2 个答案:

答案 0 :(得分:1)

好吧,因为将一个向量调整为现有大小是一个无操作,并且因为将它调整为大于它已经大于默认构造新元素,你可以这样做:

std::vector<Foo> foos = GetFoos();
foos.resize(std::max(1, foos.size()));

但是,我实际上更喜欢你的第一个例子;它更加清晰,意味着意图。

但是有一个单行程吗?不,谢天谢地。

答案 1 :(得分:1)

我不确定语言中是否有足够的技巧来支持语法

std::vector<Foo> foos = GetFoos() || {Foo()};

最好编写一个能够清楚表达你的意图并使用它的函数。

void ensureAtLeastOneElement(std::vector<Foo>& v)
{
   if (v.empty())
   {
      v.push_back(Foo());
   }
}

并将其用作:

std::vector<Foo> foos = GetFoos();
ensureAtLeastOneElement(foos);