【问题标题】:std::random_shuffle with a std::queue带有 std::queue 的 std::random_shuffle
【发布时间】:2012-12-11 12:09:55
【问题描述】:

如何使用std::queue 应用std::random_shuffle 算法?我试过这个:

std::random_shuffle(myQueue.front(), myQueue.back());

并给出错误:

  • '__i- __first' 中的 'operator-' 不匹配
  • '__first != __last' 中的 'operator!=' 不匹配
  • “__first + 1”中的“operator+”不匹配
  • “++ __i”中的“operator++”不匹配

我的队列持有Card 类,代表扑克牌。我可以理解错误来自std::random_shuffle 对队列元素所做的操作所以,即使我的Card 类不需要!= operator,我写了一个并且错误消失了。

但是我应该如何处理其余的错误?为Card 类写operators +, - and ++ 是没有意义的。

【问题讨论】:

    标签: c++ collections queue std shuffle


    【解决方案1】:

    std::queue 不是容器;它是一个容器适配器。它调整了一个序列容器以将其接口限制为简单的队列/出队操作。特别是,它不允许您(轻松地)迭代底层容器,这是std::random_shuffle 需要做的。如果您不想要这些限制,请不要使用std::queue;直接使用序列容器(如vectordeque)。

    ways可以颠覆它的接口,插手底层容器,但还是选择一个合适的容器入手会好很多。

    【讨论】:

    • 好的,我明白了这个问题,但我有一个疑问:如果deque是双队列,为什么它可以有迭代器而队列不能?对我有同样的意义
    • @RomanRdgz:因为queue 是一个适配器,而不是一个容器。它封装了一个容器(默认情况下,deque)并提供了一个更简单、更具体的界面。
    【解决方案2】:

    std::random_shuffle 需要一对迭代器。此外,std::queue 的设计并不是为了这样搞乱。它根据定义维护其元素的顺序。您可以做的是创建一个std::deque,对其进行随机播放,然后从中构造一个队列。

    std::deque<int> d {5, 1, 67, 89, 32, 444}; // populate in the order you would the queue
    std::random_shuffle(d.begin(), d.end());
    std::queue<int> q(d);
    

    【讨论】:

    • 这有必要吗?我的意思是,一旦我使用了 std::deque,使用它的 pop_front 和 push_front 方法会更好吗?
    • @RomanRdgz 如果您需要排队,最好坚持使用std::queuestd::deque 支持队列不应该的各种操作。
    【解决方案3】:

    std::random_shuffle 需要两个迭代器,但 std::queue::front()std::queue::back() 返回两个对元素的引用。 std::queue 不公开迭代器,它只提供一个接口来推回和弹出前端元素。如果您需要遍历集合,请使用 std::deque(或任何标准容器)。

    【讨论】:

      猜你喜欢
      • 2016-08-15
      • 1970-01-01
      • 2014-08-22
      • 2022-01-20
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      相关资源
      最近更新 更多