例如
struct A
{
static vector<int> s;
};
vector<int> A::s = {1, 2, 3};
但是,我的编译器不支持初始化列表。有什么办法可以轻松实现吗? lambda函数在这里有用吗?
答案 0 :(得分:4)
我总是担心会因为这样的问题被拍下来进行初始化排序,但是......
#include <iostream>
#include <vector>
#include <iterator>
struct A
{
static std::vector<int> s;
};
static const int s_data[] = { 1,2,3 };
std::vector<int> A::s(std::begin(s_data), std::end(s_data));
int main()
{
std::copy(A::s.begin(), A::s.end(),
std::ostream_iterator<int>(std::cout, " "));
return 0;
}
<强>输出强>
1 2 3
仅仅因为你可以并不意味着你应该 = P
以至少有效的方式赢得奖项:
#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
template<typename T>
std::vector<T> v_init(const T& t)
{
return std::vector<T>(1,t);
}
template<typename T, typename... Args>
std::vector<T> v_init(T&& t, Args&&... args)
{
const T values[] = { t, args... };
std::vector<T> v1(std::begin(values), std::end(values));
return v1;
}
struct A
{
static std::vector<int> s;
};
std::vector<int> A::s(v_init(1,2,3,4,5));
int main(int argc, const char *argv[])
{
std::copy(A::s.begin(), A::s.end(), std::ostream_iterator<int>(std::cout, " "));
return 0;
}
<强>输出强>
1 2 3 4 5
如果T和Args中的任何内容不符合类型或类型可转换,那么这应该在编译时呕吐。当然,如果你有可变参数模板,那么你也有初始化列表,但如果没有别的话,它会带来有趣的大脑食物。
答案 1 :(得分:4)
任何方式轻松实现它?
没有什么特别优雅的。您可以从静态数组中复制数据,也可以使用函数调用的结果对其进行初始化。前者可能会使用比你想要的更多的内存,而后者需要一些稍微混乱的代码。
Boost有一个library可以让它稍微不那么难看:
#include <boost/assign/list_of.hpp>
vector<int> A::s = boost::assign::list_of(1)(2)(3);
lambda函数在这里有用吗?
是的,它可以让您不必为了初始化矢量而命名一个函数:
vector<int> A::s = [] {
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
return v;
}();
(严格来说,这应该有一个显式的返回类型[]()->vector<int>
,因为lambda主体不仅包含return
语句。有些编译器会接受我的版本,我相信它会变成2014年的标准。)
答案 2 :(得分:3)
为向量写一个简单的init函数:
vector<int> init()
{
vector<int> v;
v.reserve(3);
v.push_back(1);
v.push_back(2);
v.push_back(3);
return v;
};
vector<int> A::s = init();
答案 3 :(得分:1)
您可以从两个指针初始化std::vector
int xv[] = {1,2,3,4,5,6,7,8,9};
std::vector<int> x(xv, xv+(sizeof(xv)/sizeof(xv[0])));
您甚至可以在模板函数中考虑到这一点:
template<typename T, int n>
std::vector<T> from_array(T (&v)[n]) {
return std::vector<T>(v, v+n);
}
答案 4 :(得分:0)
另一个想法:
struct A
{
static std::vector<int> s;
};
std::vector<int> A::s;
static bool dummy((A::s.push_back(1), A::s.push_back(2), A::s.push_back(3), false));