std::vector vec = { ... }; // Actually a member variable on a Server object
for (auto iter = vec.begin(); iter != vec.end(); ) {
if (client_closed_connection(*iter)) {
*iter = std::move(*vec.back()); // Move item to delete to the end
vec.pop_back(); // perform deletion
// Dont increment cause we dont want to skip the newly moved element
} else {
process_client_request(*iter);
iter++;
}
}
< /code>
Я не использую идиома «удалить и стирать» или аналогично, потому что порядок элементов не имеет значения, поэтому я не хочу тратить ресурсы, пытаясь сохранить его (его код для списка Epoll () FDS клиентов, подключенных к серверу, так что удаление, в то время как итерация вектора ожидается, и это часто бывает, что у меня возникает у клиентов, и это станет для клиентов, и это станет для меня, и это будет очень часто, и это будет очень часто, и это будет очень часто, и это будет очень часто. Работаю на практике, я не могу не задаться вопросом, потенциально ли я полагаюсь на UB.
Единственная проблема, если client_closed_connection ()
возвращает false для последнего достоверного элемента (для When iter == Back () )
В этом случае, *iter = std :: evel ( *vec.back). Назначение), но затем мы pop_back () , который в соответствии с итератором cppRefernce «Invalidate итератор к последнему элементу, а также end () итератор».
В нашем случае итератор , таким образом, был бы недействительным, но затем сравнивается с vec.end () , чтобы завершить цикл. />
«Несильтированное» просто означает, что я не могу преодолеть итератор? (Что было бы хорошо, так как я только сравниваю его с End ())
Я Гвафун, что iter == end () Поскольку Vector использует Legacyrandomaccessiterator, Contigound_iterator в качестве типа итератора и из -за согласованного требования памяти, end () всегда будет равным для итератора
Моя проблема-следующая: < /p> [code]std::vector vec = { ... }; // Actually a member variable on a Server object
for (auto iter = vec.begin(); iter != vec.end(); ) { if (client_closed_connection(*iter)) { *iter = std::move(*vec.back()); // Move item to delete to the end vec.pop_back(); // perform deletion // Dont increment cause we dont want to skip the newly moved element } else { process_client_request(*iter); iter++; } } < /code> Я не использую идиома «удалить и стирать» или аналогично, потому что порядок элементов не имеет значения, поэтому я не хочу тратить ресурсы, пытаясь сохранить его (его код для списка Epoll () FDS клиентов, подключенных к серверу, так что удаление, в то время как итерация вектора ожидается, и это часто бывает, что у меня возникает у клиентов, и это станет для клиентов, и это станет для меня, и это будет очень часто, и это будет очень часто, и это будет очень часто, и это будет очень часто. Работаю на практике, я не могу не задаться вопросом, потенциально ли я полагаюсь на UB. Единственная проблема, если client_closed_connection () [/code] возвращает false для последнего достоверного элемента (для When iter == Back () ) В этом случае, *iter = std :: evel ( *vec.back). Назначение), но затем мы pop_back () , который в соответствии с итератором cppRefernce «Invalidate итератор к последнему элементу, а также end () итератор». В нашем случае итератор , таким образом, был бы недействительным, но затем сравнивается с vec.end () , чтобы завершить цикл. /> [list] [*] «Несильтированное» просто означает, что я не могу преодолеть итератор? (Что было бы хорошо, так как я только сравниваю его с End ()) Я Гвафун, что iter == end () Поскольку Vector использует Legacyrandomaccessiterator, Contigound_iterator в качестве типа итератора и из -за согласованного требования памяти, end () всегда будет равным для итератора