使用带有多维向量的`push_back()`

时间:2013-11-17 06:09:32

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

说,对于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<long int>(dimensions,0));

为了澄清一下,这会在x和y坐标的第三维中插入一个带有2个索引的数组。 (在实际实施中,尺寸的数量是可变的。这些狗在数字线,象限,八分音符和你喜欢的任何orthant排便!)

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

这会简化我的代码,因为那教会了我 pooHist.pushback(std::vector<std::vector<long int>>(dimensions))也应该创造新的排便......但我离题了。

我不知道如何创造一只新的狗,一个新的排便和维数坐标槽等待新的排便。

2 个答案:

答案 0 :(得分:1)

我认为您选择pooHistory的数据结构会引起混淆。狗到排便位置的地图应该足够了。所以要存储你所需要的只是:

std::map< std::string, std::vector< location > > pooHistory;

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

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

希望这有帮助!

答案 1 :(得分:0)

啊哈!我想通了!

为简化起见,我宣布了

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维度调整大小。 一切都被初始化为零。