Как стереть все смежные записи из набора во время итерации по набору. В моем случае у меня есть пользовательский компаратор, который определяет смежные записи как те, которые отличаются на 1 слева направо. Таким образом, для набора std::set<int> mySet = {1,2,3,4,5,7,9,10}
я хотел бы удалить записи {1,2,3,4,5,9,10}
, поскольку они удовлетворяют моему компаратору. (обратите внимание, что 7 оставлено, поскольку оно единственное в ряду не является одним из элементов в соседней паре.Как удалить смежные записи из набора во время итерации по нему
Код ниже (также в coliru) показывает, что я могу найти правильные смежные записи, однако если я пытаюсь стереть как с левой стороны соседней пары adjIter
а также правой сторона *std::next(adjIter)
Аварии коды с недействительным итератором
int main() {
std::set<int> mySet = {1,2,3,4,5,7,9,10};
static const auto gPred = [](const auto& lhs, const auto& rhs) {
return rhs == lhs+1;
};
auto adjIter = mySet.begin();
std::set<int> adjacentEntries;
while ((adjIter = std::adjacent_find(adjIter, mySet.end(),
gPred)) != mySet.end()) {
adjacentEntries.insert(*adjIter);
// peek at the second entry that should be 1 greater than adjIter
adjacentEntries.insert(*std::next(adjIter));
// how do I erase both *std::next(adjIter) & adjIter
++adjIter;
}
std::cout << adjacentEntries << std::endl;
}
приятная работа! Похоже, вы все поняли, я боролся с этим алгоритмом на пару дней – johnco3