如何创建#define来创建二维矢量?

时间:2015-08-19 17:51:29

标签: c++ vector c-preprocessor

是否可以使用#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)

1 个答案:

答案 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);

Live Example

正如Nipheris所指出的,如果您无法访问auto,则可以随时创建一个typedef

typedef std::vector<std::vector<double>> vector2d;
vector2d foo = make_2d_vector<double>(5,10);