如何在多个排序列表上进行迭代?

特里格夫

好的,这是我遇到的一个面试问题,当时仅表现平平。我想知道最佳解决方案是什么以及如何最佳实施。

您将获得多个排序列表,构造一些东西可以使我们从最小到最大的元素遍历所有这些列表。

例:

{ -2, 5, 10}
{ 2, 9, 11}
{ -5, 9}


-> -5, -2, 2, 5, 9, 9, 10, 11

更新:

在SO聊天#c-questions-and-answers尤其是@Nican的帮助下,我让这艘船以某种方式飞行。我已经发布了我的工作代码,作为也允许其他解决方案的答案。

我在下面发布的答案仍然很混乱,尤其是我没有正确实现==和!=。我仍然需要帮助。

这个问题的理由

在线查找干净和简约的自定义迭代器实现并不常见。而且我相信这个问题可能是其他人加深对迭代器和最佳实践的理解的一个良好起点。

特里格夫

这不是一个完整的答案

我已经实现了部分解决方案,以使其起作用。这不是符合input_iterator要求的完整也不正确的实现。这说明了要点,剩下的工作要由任何人来决定。

-

昨天,我只是从笔记和努力中再次总结了这一点。我从尼康那里得到了一些非常好的帮助。

我正在使用堆将列表保留在我的结构中。(有一种有效的批评是我正在重塑priority_queue)。这里还缺少几件事情:

  • 复制构造函数
  • 修正后++运算符
  • 正确的==和!=实现,我只是比较大小。
  • 这很容易成为forward_iterator。

我已经达到了对迭代器的理解的基础。到目前为止,这是我要讲的。

#include <algorithm>
#include <forward_list>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>

template <typename Iter>
struct SortedListIterItem {
  Iter it_beg;
  Iter it_end;
  /* Used by the heap to sort ascending */
  bool operator<(const SortedListIterItem<Iter>& other) {
    return *it_beg > *other.it_beg;
  }
  bool operator==(const SortedListIterItem<Iter>& other) {
    return it_beg == other.it_begin && it_end == *other.it_beg;
  }
  SortedListIterItem<Iter>(Iter _begin, Iter _end)
      : it_beg(_begin), it_end(_end){};
};

template <typename Iter>
class SortedListsIter {
  // member typedefs provided through inheriting from std::iterator
  class iterator {
    std::vector<SortedListIterItem<Iter> > m_items;

   public:
    iterator(std::vector<SortedListIterItem<Iter> > _items = {})
        : m_items(_items){};
    iterator& operator++() {
      std::pop_heap(m_items.begin(), m_items.end());
      SortedListIterItem<Iter>& largest = m_items.back();

      if (++largest.it_beg == largest.it_end) {
        m_items.pop_back();
      } else {
        std::push_heap(m_items.begin(), m_items.end());
      }
      return *this;
    }
    // iterator traits
    using value_type = typename Iter::value_type;
    using pointer = typename Iter::pointer;
    using reference = typename Iter::reference;
    using iterator_category = std::input_iterator_tag;
    /** A simplified comparator, which is not a correct implementation.
     *  While it does work for regular for loops. */
    bool operator!=(iterator other) { 
      return (m_items.size() != other.m_items.size());
    }
    value_type operator*() const { 
      return *(m_items.front().it_beg); 
    };
  };
  std::vector<SortedListIterItem<Iter> > m_items;

 public:
  void add_list(Iter it_begin, Iter it_end) {
    if (it_begin != it_end) {
      m_items.push_back(SortedListIterItem<Iter>(it_begin, it_end));
      std::push_heap(m_items.begin(), m_items.end());
    }
    // Ignore empty lists.
  }
  iterator begin() { return iterator(m_items); };
  iterator end() {
    std::vector<SortedListIterItem<Iter> > _items;
    return iterator(_items);
  };
};

int main(int argc, char** argv) {
  std::forward_list<std::string> animals = {"Cat", "Dog", "Horse"};
  std::forward_list<std::string> fish = {"Dolphin", "Mermaid", "Shark"};
  std::forward_list<std::string> birds = {"Crow", "Duck", "Eagle"};
  SortedListsIter<std::forward_list<std::string>::iterator> my_string_iter;
  my_string_iter.add_list(fish.begin(), fish.end());
  my_string_iter.add_list(animals.begin(), animals.end());
  my_string_iter.add_list(birds.begin(), birds.end());

  for (auto i : my_string_iter) {
    std::cout << " " << i << ",";
  }
  std::cout << std::endl;
  for (auto i : my_string_iter) {
    std::cout << " " << i << ",";
  }
  std::cout << std::endl;

  std::vector<int> l4 = {1, 2, 99};
  std::vector<int> l5 = {-11, -4, 3};
  std::vector<int> l6 = {-5, 1};

  SortedListsIter<std::vector<int>::iterator> my_iter2;
  my_iter2.add_list(l4.begin(), l4.end());
  my_iter2.add_list(l5.begin(), l5.end());
  my_iter2.add_list(l6.begin(), l6.end());

  for (auto i : my_iter2) {
    std::cout << " " << i << ",";
  }
  std::cout << std::endl;

  return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在由元组列表组成的字典上进行迭代?

如何在itertools :: chunks上进行迭代

在排序列表与未排序列表上进行线性搜索-为什么排序速度较慢?

在数据框列上进行迭代时,如何生成多个单独的列表

如何在logstash上进行多个输出?

加入后如何在多个列上进行区分,然后为每个组排序并选择最新的?

如何根据参数在不同列表上进行迭代

如何按python中的顺序列表对多个列表进行排序?

如何在Pandas中的DataFrame中的行上进行迭代

如何在某些源上进行并发迭代器?

如何在SciPy稀疏矩阵中的行上进行迭代?

如何在std :: set上进行迭代时删除元素

如何在车把中的对象的属性上进行迭代

PHP如何在层级平面数组上进行迭代?

如何在输入装饰器传递的数组上进行迭代

如何在Presto ARRAY(MAP(VARCHAR,VARCHAR))上进行迭代

在一个选择查询中计算多个聚合函数时,SQL Server如何在行上进行迭代

如何在Freemarker序列上进行投影以提取属性?

Pandas groupby,如何在多个列上进行多个聚合?

如何在python中将嵌套列表作为字典值进行迭代和排序?

Datables 如何在屏幕呈现的 mData 上进行排序

如何在R中排序列表?

随后在多个std容器上进行迭代

在数组与列表上进行迭代的性能

如何在Kotlin或Java中对排序列表进行设置操作?

如何在Python中同时对多个不同的列表进行相同的迭代

在Python中,如何在一个迭代器上进行迭代,然后在另一个迭代器上进行迭代?

如何在Excel中的多个条件上进行索引匹配?

如何在多个色谱柱上进行熊猫采样?