从其中一个参数中查找向量中的元素

时间:2016-02-26 04:47:02

标签: c++ c++11

我如何从其使用emplace_back设置的参数中找到向量中的元素 尝试分离线程然后将其从vector中删除。

std::vector<std::thread> vTimerThreads;
void SetTimer(UINT ID, DWORD dwMilliseconds)
{
    // timerThreadProc is my thread that handles my timers
    vTimerThreads.emplace_back(timerThreadProc, ID, dwMilliseconds);
}
void DeleteTimer(UINT ID)
{
    //Find thread by ID?
    //  thread.detach();
    // then delete
}

SetTimer(TIMER1, 5000);

2 个答案:

答案 0 :(得分:3)

std::find_if听起来就像你想要根据id删除一样。

void DeleteTimer(std::thread::id ID)
{
    std::vector<std::thread>::iterator itr = std::find_if(vTimerThreads.begin(), vTimerThreads.end(), [&](const std::thread& t) { return t.get_id() == ID; });
    if( itr != vTimerThreads.end() )
       vTimerThreads.erase(itr);
}

我在这里使用过lambda,但没有必要。

如果您正在考虑使用大量线程,那么可能不同的数据结构会更适合您。你有没有考虑过std :: set来加快搜索速度?也许即使是map或hash_map对你有好处,其中id是关键?您可以使用移动语义而不是emplace_back将线程放入这些容器中而无需复制(因为我怀疑是在激励您使用emplace)。

查看std::algorithm library但是,那里有一些很棒的东西

编辑: 我在其中一条评论中看到OP说ID实际上并不是线程ID。除非我们能够澄清我们要搜索的std::vector<T>的T成员,否则无法提供明确的解决方案。

只要我正在进行编辑,这里有一些代码可以在不复制的情况下将线程添加到std :: map。使用以下代码,通过std :: thread :: id或其他任何你想用作键的元素来查找元素然后删除它将是微不足道的。

std::map<std::thread::id, std::thread> mapTimerThreads;

void AddNewThreadToMap()
{
    std::thread t;
    mapTimerThreads[t.get_id()] = std::move(t);
}

答案 1 :(得分:1)

如果你想做一个简单的线性搜索(如果线程数量不大则有意义)你可以做到

void DeleteTimer(UINT ID)
{
  for(int i = 0; i < vTimerThreads.size(); i++)
    if(vTimerThreads[i].get_id() == ID)
    {
      vTimerThreads.erase(vTimerThreads.begin()+i);
      break;
    }
}

如果您的线程数量很大,那么任意删除都很昂贵 - 在这种情况下,您可能需要考虑forward_list而不是vector