【问题标题】:How to initialize 2d vector using constructor in c++?如何在 C++ 中使用构造函数初始化二维向量?
【发布时间】:2014-02-13 15:14:13
【问题描述】:

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

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}};

如何初始化二维向量?

【问题讨论】:

  • 记住向量在内存中是连续的
  • @Jarod42 您不应该在问题中编辑 OP 的代码。
  • @herohuyongtao:float yy = {{..}} 无效。而且我的编辑不会使发布的答案无效。
  • @Jarod42:我认为它无效是问题的一部分。
  • @LightnessRacesinOrbit:我可以恢复到以前的代码吗?

标签: c++ vector


【解决方案1】:

在当前的 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

【讨论】:

  • @sefat:你需要 C++11(-std=c++11 在 gcc 编译器标志中)。
  • @Jarod42:谢谢你。我已经为 c++11 配置了代码块,现在它可以工作了。
【解决方案2】:

在 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}
};

【讨论】:

  • 要了解更多信息的内容包括 initializer_lists 和 c++11 中的统一初始化。
  • @juanchopanza 在这种情况下同样有效。我个人的偏好是“几乎总是自动”。在这种情况下,它几乎没有什么区别,因为我们致力于类型 std::vector<:vector>>,并且我们没有节省任何打字。这里只是风格问题。理想情况下,它的作用是告知程序员不要将 yy 视为向量的向量,而应将其视为任何 2D 容器,尽管可能需要为 yy 取一个更好的名称来说明这一点。
  • 这真的毫无意义。因为 RHS 上的东西明确地是向量的向量。此外,这要求复制构造函数是可访问的。在这种情况下,它可以工作,但并非总是如此。这是一个额外的限制,收益甚微。
  • 它不要求复制构造函数是可访问的,它要求复制构造函数或移动构造函数是可访问的,是的,这是一个限制,但在这种情况下,该限制也是由使用 std::vector 要求对象是可复制或可移动的,因此在这种情况下除了样式之外没有真正的区别。
【解决方案3】:

如果您事先不知道这些值,您仍然可以使用初始值初始化二维向量。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    相关资源
    最近更新 更多