Уникальные элементы в unordered_set, удаляющиеся и добавляющиеся во время итерации?

#c #hashset #unordered-set

#c #hashset #неупорядоченный набор

Вопрос:

Я пытаюсь реализовать рекурсию, в которой я передаю unordered_set<int> по ссылке / псевдониму, чтобы уменьшить пространственную и временную сложность. Чтобы сделать это, я должен итеративно выполнить следующее: удалить элемент, вызвать рекурсивно, а затем удалить элемент из unordered_set .

Это пример кода для рекурсивной функции для печати всех перестановок a vector<int> A выглядит следующим образом,

 void recur(int s, vector<int> amp;A, vector<int> amp;curr, vector<vector<int>> amp;ans, unordered_set<int> amp;poses){
   if(s == A.size()){
       ans.push_back(curr);
       return;
   }
   for(unordered_set<int>::iterator it = poses.begin() ; it != poses.end() ; it  ){
       int temp = *it;
       curr[temp] = A[s];
       poses.erase(it);
       recur(s   1, A, curr, ans, poses);
       poses.insert(temp);
       curr[temp] = -1;
   }
}
  

Вы можете предположить, что я curr изначально передаю -1s все.

При добавлении итерации через an unordered_set гарантируется поиск всех уникальных элементов. Мне было интересно, будет ли то же самое, если я удалю и добавлю элементы обратно во время итерации. Изменится ли положение элемента в hashset , или это зависит от реализации. Если это неверно, может ли кто-нибудь также предложить какой-то другой способ сделать это, поскольку я не хочу передавать по значению, поскольку это скопировало бы все это для всех рекурсивных вызовов в стеке. Любая помощь будет оценена.

Комментарии:

1. poses.erase(it); аннулирует it . Даже если вы вставляете элемент обратно, it он не восстанавливается. Итак, в следующий раз, когда вы используете этот итератор, у вас неопределенное поведение.

2. Что, если я тоже сделаю it = poses.find(temp) это после вставки? Я все равно получу уникальные элементы?

3. it = poses.erase(it) вместо it того, чтобы сделать трюк (это было бы для a set , не уверен unordered_set )

4. Но мне нужно добавить элемент обратно в набор. В противном случае пострадают последующие рекурсивные вызовы. Если я добавлю его обратно после it=poses.erase(it) , не столкнусь ли я с этим элементом позже?