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)
队列不允许迭代其元素.
来自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是愚蠢的.