#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
того, чтобы сделать трюк (это было бы для aset
, не уверенunordered_set
)4. Но мне нужно добавить элемент обратно в набор. В противном случае пострадают последующие рекурсивные вызовы. Если я добавлю его обратно после
it=poses.erase(it)
, не столкнусь ли я с этим элементом позже?