【问题标题】:Inserters for STL stack and priority_queueSTL 堆栈和 priority_queue 的插入器
【发布时间】:2011-05-06 03:38:26
【问题描述】:

std::vectorstd::liststd::dequestd::back_inserterstd::setstd::inserter

对于std::stackstd::priority_queue,我假设等效的插入器是push(),但我似乎找不到要调用的正确函数。

我的意图是能够将以下函数与正确的插入迭代器一起使用:

#include <string>
#include <queue>
#include <iterator>

template<typename outiter>
void foo(outiter oitr)
{
   static const std::string s1 ("abcdefghji");
   static const std::string s2 ("1234567890");
   *oitr++ = s1;
   *oitr++ = s2;
}

int main()
{
   std::priority_queue<std::string> spq;
   std::stack<std::string> stk;

   foo(std::inserter(spq));
   foo(std::inserter(stk));

   return 0;
}

【问题讨论】:

    标签: c++ stl containers priority-queue inserter


    【解决方案1】:

    您始终可以按照自己的方式自己实现迭代器。我尚未验证此代码,但它应该可以工作。强调“我还没有验证”。

    template <class Container>
      class push_insert_iterator:
        public iterator<output_iterator_tag,void,void,void,void>
    {
    protected:
      Container* container;
    
    public:
      typedef Container container_type;
      explicit push_insert_iterator(Container& x) : container(&x) {}
      push_insert_iterator<Container>& operator= (typename Container::const_reference value){
        container->push(value); return *this; }
      push_insert_iterator<Container>& operator* (){ return *this; }
      push_insert_iterator<Container>& operator++ (){ return *this; }
      push_insert_iterator<Container> operator++ (int){ return *this; }
    };
    

    我还要添加以下函数来帮助使用它:

    template<typename Container>
    push_insert_iterator<Container> push_inserter(Container container){
        return push_insert_iterator<Container>(container);
    }
    

    【讨论】:

    • 所以你的意思是没有标准的,比如 std::back_inserter 或 std::inserter - 简而言之,你的答案很好,我目前正在做的。 .. 只是希望我错过了 stl 中的一些东西 - 当 stl 中已经有东西时,不喜欢推出我自己的东西
    • @sonicoder 不是我所知道的。除了来自 ostream 的插入器之外,我只知道前插入器、后插入器和常规插入器。您可能会关注 Boost,但我相信即使是这些也会让您想要满足您的需求。
    • 我认为应该是:std::iterator<:output_iterator_tag>
    • @sonicoder 所以你是对的。迭代器只有 5 个参数。我还添加了一个非常类似于 back_inseterfront_inserter 函数的辅助函数。
    • @sonicoder 让我知道它是如何工作的。我将来可能想自己使用它。
    【解决方案2】:

    另一种选择(更简单)只是使用底层数据结构(std::stack 通常使用 std::deque 实现)并接受您必须使用例如push_back() 而不是 push()。不必编写自己的迭代器,并且不会特别影响代码的清晰度。 std::stack 不是您对堆栈概念建模的唯一选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多