根据 stackoverflow 和 cppreference 中描述的迭代器失效规则,我知道除非重新哈希,否则 unordered_map 的迭代器不会失效。
如果我使用 std::vector 类比,那么这是否意味着所有插入都在迭代器当前指向位置之前进行?
我正在修改正在迭代的 unordered_map,并希望确保由于迭代器失效而导致的任何问题都不会发生。我至少正在使用 reserve 关键字避免重新哈希 unordered_map reserve。
这是我正在编写的示例代码:
// Function to return vector containing the subvector of inputVector with sum desiredSum, this function returns empty vector if sum not found
std::vector<int> sumVectorFunc(const std::vector<int>& inputVector, const int desiredSum){
std::unordered_map< int,std::vector<int> > sumToSubVector{};
sumToSubVector.reserve(desiredSum+1);
// initialization with the zero sum
sumToSubVector[0] = std::vector<int>{};
for(auto itVector : inputVector){ // iterate over the vector of elements
std::unordered_set<int> numbersAddedThisCycle{};
for(auto itSubVectors : sumToSubVector){ // iterate over constructed subVectors
auto sum = itVector + itSubVectors.first;
//the new sum constructed by adding this new vector element is not yet found and make sure that you are not adding the same element again and again to get new numbers
if(sumToSubVector.find(sum) == sumToSubVector.end() && numbersAddedThisCycle.find(sum) == numbersAddedThisCycle.end()){
sumToSubVector[sum] = itSubVectors.second;
sumToSubVector[sum].push_back(itVector);
numbersAddedThisCycle.insert(sum);
}
}
}
// for(auto it : sumToSubVector){
// std::cout<<"FOr sum "<<it.first<<", we need the elements : ";
// for(auto it2 : it.second){
// std::cout<<it2<<" ";
// }std::cout<<"\n";
// }
return sumToSubVector[desiredSum];
}
我相信这个特定的实现即使在迭代器位置之前插入也不会出问题(即循环不会遍历在该插入周期中插入的元素)。
总结一下问题:插入发生在哪里?我的循环会如何处理这个插入?即使迭代器没有失效,
unordered_map
正在进行范围遍历时显然已经改变,这会影响循环吗?插入的元素是否会被跳过?