删除STL vector中的表项

Deleting entries in STL vector

本文关键字:STL vector 删除      更新时间:2023-10-16

我想清理指针存储在STL vector中的线程。我的做法如下。这是正确的做法,因为我正在删除条目,同时循环通过vector或有更好的方法来做到这一点。

请建议。

template <typename threadFuncParamT >
bool ThreadPool<threadFuncParamT>::KillSleepingThreads()
{
  if(m_vecThreads.size() != 0)
  {
      for (; std::vector< ThreadWrapper < threadFuncParamT>* >::iterator itrCollThreads !=  values.end(); )
      {
    ThreadWrapper < threadFuncParamT> *pWrapper = m_vecThreads.back();
            m_vecThreads.pop_back();
            delete pWrapper;
      } // for loop
  } // if condition
}

谢谢!

如果你被允许使用c++ 11,那么让它变得可爱:

for (auto it = m_vecThreads.begin() ; it !=  m_vecThreads.end(); ++it )
{
     delete *it;
}
m_vecThreads.clear();

你可以让它更可爱(当然,在c++ 11中-感谢@celtschk的评论):

for (auto & ptr: m_vecThreads) //it is called range-based for loop
{ 
    delete ptr; 
}
m_vecThreads.clear();

或者如果不允许使用c++ 11,那么将auto(在第一个 for循环中)替换为:

  typename std::vector<ThreadWrapper<threadFuncParamT*>::iterator
//^^^^^^^^ you've to typename as well

注意,您也必须使用typename,因为iterator是一个依赖名称。

同样,下面的代码是不需要的,从你的代码中删除它:

if(m_vecThreads.size() != 0) // not needed!

在你的函数中试试:

     for(size_t i = 0; i < m_vecThreads.size(); ++i)
     {
        delete m_vecThreads[i];
     }
     m_vecThreads.clear();

看起来比实际需要的复杂得多。如果你真的想删除向量中的每一项,只需delete每一项,然后清除整个向量。

for(std::vector<ThreadWrapper<threadFuncParamT*>>::iterator
        i = m_vecThreads.begin();
    i != m_vecThreads.end();
    ++i)
{
    delete *i;
}
m_vecThreads.clear();

作为题外话,通常有一个智能指针向量(例如boost::shared_ptr)比必须显式删除项更好。