如何在C++中使用构造函数初始化二维向量?

4

我知道如何像这样初始化一维向量

int myints[] = {16,2,77,29};
std::vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));

假设我有二维数据。
float yy[][2] = {{20.0, 20.0}, {80.0, 80.0}, {20.0, 80.0}, {80.0, 20.0}};

如何初始化一个二维向量?


请记住,向量在内存中是连续的。 - Marco A.
1
@Jarod42,您不应该在问题中编辑原始帖的代码。 - herohuyongtao
@herohuyongtao: float yy = {{..}} 是无效的。而我的编辑并不会使已发布的答案无效。 - Jarod42
1
@Jarod42:我认为这是问题的一部分,因为它是无效的。 - Lightness Races in Orbit
@LightnessRacesinOrbit:我可以回滚到以前的代码吗? - Jarod42
3个回答

6

在当前的C++(自2011年起)中,您可以在构造函数中初始化这样的向量:

vector<vector<float>> yy
{
    {20.0, 20.0},
    {80.0, 80.0},
    {20.0, 80.0},
    {80.0, 20.0}
};

实时查看代码演示:http://ideone.com/GJQ5IU


1
@sefat:你需要使用C++11(在gcc编译器标志中为“-std=c++11”)。 - Jarod42
@Jarod42:谢谢。我已经配置了C++11的CodeBlocks,现在它可以工作了。 - Jaeger

4

如果您不事先知道值,仍然可以使用初始值初始化2D向量。

vector< vector <int> > arr(10, vector <int> (10, 0));

上面的代码将初始化一个10X10的二维向量,所有索引值都为零(0)。

3
在C++ 11中,您可以像这样初始化一个向量的向量:
auto yy = std::vector<std::vector<float>>
{
    {20.0, 20.0},
    {80.0, 80.0},
    {20.0, 80.0},
    {80.0, 20.0}
};

需要了解更多信息的内容包括C++11中的initializer_lists和uniform initialization。 - YoungJohn
@juanchopanza 在这种情况下,那也同样适用。我个人更喜欢“几乎总是自动”。在这种情况下,由于我们已经确定了类型std::vector<std::vector<float>>,并且没有节省任何输入,所以几乎没有区别。在这里,这只是一个风格问题。理想情况下,它有助于告诉程序员不要将yy视为向量的向量,而是将其视为任何二维容器,尽管可能需要一个更好的名称来强调这一点。 - YoungJohn
2
这真的毫无意义。因为右手边的东西明确地是一个向量的向量。此外,这要求复制构造函数可访问。在这种情况下它可以工作,但并不总是如此。这是一个额外的限制,收益微小。 - juanchopanza
它不要求可访问复制构造函数,而是要求可访问复制构造函数或移动构造函数,是的,这是一种限制,但在这种情况下,这种限制也是通过使用std::vector强加的,它要求对象可复制或可移动,因此在这种情况下,除了样式之外,实际上没有什么区别。 - YoungJohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接