【问题标题】:Data structures for iterating through multiple collections用于迭代多个集合的数据结构
【发布时间】:2020-03-22 14:00:47
【问题描述】:

我有带有时间戳的对象,比如说:

class data_point
{
     public:
     data_point(time_t _ts, char _data):timestamp(_ts), data(_data) {}
     time_t timestamp;
     char    data;
}

假设您有 N 个这些数据点的集合。对于每个集合,您都知道它们是按时间顺序排列的。我想要做的是遍历这些集合,这样我将为每个 data_point 获得一次回调,但顺序正确。基本上,我正在寻找一种可以使用 N 个集合初始化的数据结构,并返回一个迭代器,该迭代器将允许通过它们选择具有“最低”时间戳的下一个项目,优先考虑首先添加到集合中的集合。理想情况下,代码可能如下所示:

std::vector<data_point> a1 = { data_point(1, 'a'), data_point(6, 'b'), data_point(11, 'c') };
std::vector<data_point> a2 = { data_point(1, 'd'), data_point(8, 'e'), data_point(12, 'f') };
std::vector<data_point> a3 = { data_point(1, 'g'), data_point(9, 'h'), data_point(11, 'i') };

SomeCollection c = { a1, a2, a3 }; 
// or possibly if needed
// SomeCollection c; c.add(a1); c.add(a2); c.add(a3);
for(auto &d: c)
{
     std::cout << d.data << std::endl;
}

哪个会输出:

a
d
g
b
e
h
c
i
f

我可以编写自己的类,但想知道是否已经存在类似的东西。

【问题讨论】:

  • 保持N个集合不变的意图?或者您只是想按顺序访问它们的值以进行(例如)打印?
  • 是的,保留初始集合,但有一个将它们视为队列的迭代器,其中 ++ 将您移动到具有最低队列的所有集合中的下一个项目。
  • 输入是否保证有序?
  • @Caleth - 是的,假设每个集合,在这种情况下是一个向量,已经有序。理想情况下,这也适用于其他集合。

标签: c++ for-loop templates iterator


【解决方案1】:

为什么没有集合集合,即std::vector&lt;std::vector&lt;data_point&gt;&gt; dataPointCollectors

将数据添加到这些中,然后迭代并打印内容

【讨论】:

  • 这并没有给我一个迭代器,它按照原始帖子中的描述工作。
【解决方案2】:

您可以从每个输入重复插入和std::inplace_merge

std::vector<data_point> c;

for (auto * a : { &a1, &a2, &a3 })
{
    auto mid = c.size();
    c.insert(c.end(), a->begin(), a->end());
    std::inplace_merge(c.begin(), c.begin() + mid, c.end());
}

【讨论】:

  • 这似乎连接了集合。我想将它们都视为队列,但有一个迭代器,它可以移动到所有集合中具有最低时间戳的下一个项目。
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2019-11-17
  • 2015-08-23
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多