问题
我有一个模板容器MyContainer<std::unique_ptr<Foo>>
,它有一个std::deque<T>
和一个std::vector<T>
成员。
在方法send_to_purgatory_if( predicate )
中,如果谓词为真,我想查看m_taskdq
中的所有项目并将项目从m_taskdq
移动到m_purgatory
。
问题
我遇到了两个问题:
- 如果我在循环中从
m_taskdq
中删除项,则我的迭代器it
会被破坏 - 如果我分两步进行移动(问题行1和2 - 到第二行时,我认为由
it
指向的std::unique_ptr<>
是未定义的),则我担心std::unique_ptr<>
的状态如何?
我应该如何修复这段代码?
template <typename T>
class MyContainer
{
typedef std::function<bool(T&)> PREDICATE;
void send_to_purgatory_if( PREDICATE p )
{
// bad code -------------------------------------
for( auto it=m_taskdq.begin(); it!=m_taskdq.end(); ++it )
{
if ( p( *it ) )
{
m_purgatory.emplace_back( move( *it )); // problem line 1
m_taskdq.erase( it ); // problem line 2
}
}
// end bad code ---------------------------------
}
std::deque< T > m_taskdq;
std::vector< T > m_purgatory;
};