是否可以使用#define
语句执行以下操作:
对于一个简单的向量我可以这样做:
#define dvec std::vector<double>
dvec x1d(n)
请注意,实例化它与普通矢量相同。但对于2D矢量,它并不那么好:
#define dvec2d std:vector<std:vector<double>>
dvec2d x2d(n, std:vector<double>(m))
我如何创建一个定义,以便我需要做的就是实例化dvec2d:
dvec2d x2d(n, m)
当然,我可以这样做:
dvec2d x2d(n, std:vector<double>(m))
每次我想创建其中一个,但我宁愿没有那个额外的std:vector<double>
- 如果我能拥有dvec2d x2d(n, m)
那就更整洁了。
编辑:为了澄清,我知道我可以创建一个函数来给我一个向量,或一个typedef,这不是我想要的。使用这些功能的人将会vector<vector<double>>
放入其中,这就是他们需要的东西。但我不希望由于其中的所有定义而具有大规模的功能定义。使用#define dvec2d ...
可以解决这个问题。
现在,当我测试我的东西时,我需要创建2d向量。我知道我可以用dvec2d my2dVector(n, std::vector<double>(m))
来做,但我想知道的是,如果有任何方法我可以写#define
这样我就可以创建这样的人:dvec2d my2dVector(n,m)
?
答案 0 :(得分:3)
您可以使用模板功能,而不是使用宏。您可以创建make_2d_vector
函数,如:
template<typename T>
std::vector<std::vector<T>> make_2d_vector(std::size_t rows, std::size_t cols)
{
return std::vector<std::vector<T>>(rows, std::vector<T>(cols));
}
然后,当您想要创建2d矢量时,您可以使用:
auto foo = make_2d_vector<double>(5,10);
正如Nipheris所指出的,如果您无法访问auto
,则可以随时创建一个typedef
:
typedef std::vector<std::vector<double>> vector2d;
vector2d foo = make_2d_vector<double>(5,10);