使用std :: copy插入STL队列

And*_*aam 16 c++ queue stl copy insert-iterator

我想std::copy用于将元素插入到队列中,如下所示:

vector<int> v;
v.push_back( 1 );
v.push_back( 2 );

queue<int> q;

copy( v.begin(), v.end(), insert_iterator< queue<int> >( q, q.front() ) );
Run Code Online (Sandbox Code Playgroud)

但这无法编译,抱怨begin不是其中的一员std::queue.

注意:我也试过std::inserter了 - 这也失败了,这次说'reference'不是'std :: queue'的成员. std::back_inserter并且std::back_insert_iterator还失败,相同的错误.

我错过了一些明显的东西,还是insert_iterator只是不能使用队列?

CB *_*ley 21

不幸的是,std::queue"适应"已知的功能push_back,push这意味着标准back_insert_iterator不起作用.

可能最简单的方法(虽然在概念上很丑陋)是使容器适配器适应短暂的容器适配器适配器[原文](eugh!),其寿命与后插入迭代器一样长.

template<class T>
class QueueAdapter
{
public:
    QueueAdapter(std::queue<T>& q) : _q(q) {}
    void push_back(const T& t) { _q.push(t); }

private:
    std::queue<T>& _q;
};
Run Code Online (Sandbox Code Playgroud)

像这样使用:

std::queue<int> qi;

QueueAdapter< std::queue<int> > qiqa( qi );

std::copy( v.begin(), v.end(), std::back_inserter( qiqa ) );
Run Code Online (Sandbox Code Playgroud)

  • 天才.整洁,漂亮,并且首先暴露了使用名称push而不是push_back的奇怪决定. (3认同)
  • 它不是"push_back",因为插入发生的点在概念上并不重要.此外,`push_back`对于'priority_queue`意味着什么? (2认同)

Fra*_*ger 8

队列不允许迭代其元素.

来自SGI STL文件:

队列是提供容器功能的受限子集的适配器.队列是"先进先出"(FIFO)数据结构.1 也就是说,元素被添加到队列的后面并且可以从前面移除; Q.front()是最近最少添加到队列的元素.队列不允许迭代其元素.[2]

可以使这项工作,但你不能使用insert_iterator.你必须编写类似的东西queue_inserter,它提供了一个迭代器接口.

更新我无法帮助自己,并试图实现您需要的迭代器.结果如下:

template< typename T, typename U >
class queue_inserter {
    queue<T, U> &qu;  
public:
    queue_inserter(queue<T,U> &q) : qu(q) { }
    queue_inserter<T,U> operator ++ (int) { return *this; }
    queue_inserter<T,U> operator * () { return *this; }
    void operator = (const T &val) { qu.push(val); }
};

template< typename T, typename U >
queue_inserter<T,U> make_queue_inserter(queue<T,U> &q) {
    return queue_inserter<T,U>(q);
}    
Run Code Online (Sandbox Code Playgroud)

这适用于这样的功能:

template<typename II, typename OI>
void mycopy(II b, II e, OI oi) {
    while (b != e) { *oi++ = *b++; }
}
Run Code Online (Sandbox Code Playgroud)

但它不适用于STL副本,因为STL是愚蠢的.

  • 你的queue_inserter是不可赋值的,但除了你没有_have_派生自`iterator`之外,如果你想能够使用标准算法的迭代器,你只需要提供`iterator_traits`的特化. (4认同)
  • 为什么不实现queue_inserter以对应back_insert_iterator接口?`std :: copy`不是'stupid'(恕我直言!),它只需要一个输出迭代器,它不是一个繁重的接口. (2认同)
  • 顺便说一句,特别是`std :: copy`通常需要了解迭代器的更多信息,因此它可以选择一种最佳的方法:例如指针+ POD可以被memmoved. (2认同)