【问题标题】:Using `push_back()` with multidimensional vectors将 `push_back()` 与多维向量一起使用
【发布时间】:2013-11-17 06:09:32
【问题描述】:

说,对于 MWE,我有一些代码,例如:

typedef std::vector<std::vector<std::vector<long int> > > pooHistory;
pooHistory pHist (1, vector<vector<long int>>(1, vector<long int>(1,0)));

跟踪的,例如:

  • 狗的数量
  • 每只狗的排便次数
  • 每次排便的位置。

当我试图创造新的狗时,排便和协调我遇到了一些问题。 我可以用

创建新的排便

pooHist.walkHist.back().push_back(std::vector&lt;long int&gt;(dimensions,0));

为了澄清一下,这会在 x 和 y 坐标的第三维中插入一个具有 2 个索引的数组。 (在实际实现中,维度的数量是可变的。这些狗在数轴、象限、八分圆和任何你喜欢的方位上排便!)

但我似乎无法创造新的狗。 我尝试了类似的东西 pooHist.pushback(std::vector&lt;std::vector&lt;long int&gt;&gt;(1)),但这创造了一个新的排便空间,只有 1 个坐标。

这确实简化了我的代码,因为这教会了我 pooHist.pushback(std::vector&lt;std::vector&lt;long int&gt;&gt;(dimensions)) 也应该造成新的排便......但我离题了。

我不知道如何创建一条新狗,它有 1 次新的排便,并且有维度编号坐标槽等待新的排便。

【问题讨论】:

  • 与您的实际问题无关的内容:pooHist.size()vector::at 函数接受的确切类型,因此您对 unsigned long int 的强制转换既不必要又错误。你可以简单地使用vector::back
  • 谢谢,这两个我都修好了。我之前尝试过std::vector::back,但我执行错了。现在我只需要弄清楚原来的问题。

标签: c++ c++11 vector multidimensional-array


【解决方案1】:

我认为您为pooHistory 选择的数据结构造成了混乱。一张狗到排便位置的地图就足够了。因此,存储您所需要的只是:

std::map&lt; std::string, std::vector&lt; location &gt; &gt; pooHistory;

其中locationstruct location { double lat; double lon; };。 map 的第一个模板参数是std::string,因为它表示狗的名字。如果您选择使用整数 id,则可以将其更改为 int

每只狗排便的次数简直就是pooHistory["dog-name"].second.size()

希望这会有所帮助!

【讨论】:

  • 正如我在问题中所说,在运行时之前不知道维度的数量。它可以是 lat 和 lon,它可以是 x、y、z,它可以是一维射线,等等。而且狗实际上并没有名字 ;)。此代码是 MWE。我声明它应该适用于 n 维的地方是在括号中:“在实际实现中,维数是可变的。这些狗在数轴、象限、八分圆和任何你喜欢的 orthant 上排便!”
  • 您应该创建一个Locationclass 来处理那些运行时定义的坐标并创建一个地图std::map&lt;DogId, Location&gt;。不要用血淋淋的细节弄乱你的顶级数据结构。
  • 你不能动态创建一个结构......我必须为 n 维坐标创建新的双精度。
  • @NictraSavios:location* p = new location(); 不是动态创建location 的实例吗?如果您的 location 是一个 n 维向量,则对其进行相应建模。我不确定你的参考系是什么,对于地球上的位置,如果你使用笛卡尔坐标(这使得 n
  • 但是在我的问题中,我在哪里具体说明我在地球上?使用笛卡尔?还是有任何假设?该程序实际上可以处理场论和球坐标,并且应该对多达 11 维有效,但将其设为 n 维在应用程序中更有意义。 (因为 11 目前相当随意。)是的,您创建了另一个位置,但没有创建另一个维度。
【解决方案2】:

啊哈!我想通了!

为了简化,我声明

typedef std::vector<std::vector<long int> > columnVec;
typedef std::vector<long int> rowVec;

然后像这样使用 std::vector::push_back 和 std::vector:resize :

pooHist.back().push_back(rowVec(0));
walkHist.back().back().resize(dimensions,0);

pooHist.push_back(columnVec(0));
walkHist.back().resize(1);

前两行创建一个新的排便列表,最后两行创建一个新的排便并用 n 维调整大小。 一切都初始化为零。

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2021-01-29
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多