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);
}
Здесь я использовал лямбда, но это необязательно.
Если вы думаете об использовании большого количества потоков, возможно, другая структура данных подойдет вам лучше. Вы считали std :: set для более быстрого поиска? Возможно, даже карта или hash_map были бы полезны для вас, где id является ключом? Вы можете помещать потоки в эти контейнеры с семантикой перемещения вместо emplace_back без копирования (поскольку, как я подозреваю, мотивирует вас использовать emplace).
Отъезд std::algorithm library хотя, есть некоторые большие вещи там
EDIT: я вижу в одном из комментариев OP говорит, что ID не на самом деле идентификатор потока. Если мы не сможем выяснить, какой член T для std::vector<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);
}
Вы не сохранили 'ID' в любом месте, по крайней мере, в любом месте, доступном из вектора. – chris