关于c ++:有没有办法用一行初始化容器?

Is there a way to initialize a container with one line?

本问题已经有最佳答案,请猛点这里访问。

我正在寻找香草C++ 98解决方案(没有升压,或QT等)。

有没有办法做到这一点:

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

或者像这样的

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

现在,我用这个:

1
2
3
4
5
std::vector<Foo> vFoo;
vFoo.push_back(Foo1);
vFoo.push_back(Foo2);
vFoo.push_back(Foo3);
vFoo.push_back(Foo4);

但我觉得很难看。有什么改进的主意吗?有没有特殊的方法来实现它?

谢谢您。


简短的回答:不,这就是为什么在C++ 11中添加这样的结构的语言支持的原因。如果你不能使用C++ 11,你现有的EDCOX1×1的解决方案就足够了。


可以从数组初始化向量:

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#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;
}

如果你想要更多的答案,请点击布朗医生的链接。