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); |
我使用
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; } |
如果你想要更多的答案,请点击布朗医生的链接。