【问题标题】:Is there a way to initialize a container with one line? [duplicate]有没有办法用一行初始化一个容器? [复制]
【发布时间】:2014-05-17 20:31:46
【问题描述】:

我正在寻找原版 C++98 解决方案(无 boost,或 qt 等)

有没有办法做某事like this

// valid in c++ 11
std::vector<Foo> vFoo {Foo1, Foo2, Foo3, Foo4} ;

或类似的东西

// Well it is C# but you got the point.
List<Foo> lFoo = new List<Foo>() { Foo1, Foo2, Foo3, Foo4 };

现在,我用这个:

std::vector<Foo> vFoo;
vFoo.push_back(Foo1);
vFoo.push_back(Foo2);
vFoo.push_back(Foo3);
vFoo.push_back(Foo4);

但我觉得它很丑。有什么改进的办法吗?有什么特殊的方法可以实现吗?

谢谢。

【问题讨论】:

  • 单行并不总是更好,通常它们在可读性方面更差
  • @DocBrown 感谢您的链接!里面有很多不错的解决方案。我会关闭这个。
  • C++89?为什么不是 C++81?
  • @KerrekSB 时髦的东西你知道。 C++89 太复古了。好吧错字错误。我纠正它。

标签: c++ collections


【解决方案1】:

简短回答:不。这就是为什么在 C++11 中添加了对此类结构的语言支持。如果您不能使用 C++11,您现有的 push_back 解决方案就足够了。

【讨论】:

  • 我终于用自己的答案了。顺便说一句,我喜欢这个one
  • @aloisdg:我不知道,我认为将变量函数放入 C++ 是对您自己、未来读者和人类的彻底伤害。拒绝吧。 (是的,从现有集合进行初始化一直很容易。但这是在做一些不同的事情。)
【解决方案2】:

我使用va_arg 构建自己的解决方案。

#include <cstdarg>
#include <iostream>
#include <vector>

template <typename T>
std::vector<T> initVector (int len, ...)
{
  std::vector<T> v;
  va_list vl;
  va_start(vl, len);
  v.push_back(va_arg(vl, T));
  for (int i = 1; i < len; ++i)
    v.push_back(va_arg(vl, T));
  va_end(vl);
  return v;
}

int main ()
{
  std::vector<int> v = initVector<int> (7,702,422,631,834,892,104,772);
  for(std::vector<int>::const_iterator it = v.begin() ; it != v.end(); ++it)
    std::cout << *it << std::endl;
  return 0;
}

如果您想了解更多答案,请关注Doc Brownlink

【讨论】:

  • 请记住,这仅适用于 POD 类型(基本数据类型,加上没有用户定义的构造函数的类、虚拟成员、引用等)。 C++03 标准参考:5.2.2/7.
  • 感谢您的评论。 I learn something new today.
  • 不客气。恐怕 C++ 充满了黑暗的角落;)
【解决方案3】:

你可以从一个数组初始化一个向量:

Foo[] initFoo = { Foo1, Foo2, Foo3, Foo4 };
std::vector<Foo> vFoo(initFoo, initFoo + 4);

【讨论】:

  • 同样的想法here。我也喜欢。
猜你喜欢
  • 2018-01-13
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
相关资源
最近更新 更多