c++中的unordered_set中是否存在任何顺序?
Is there any order exists in unordered_set in c++?
int main(){
unordered_set<int> S;
S.insert(1);
S.insert(10);
S.insert(100);
S.insert(64);
for(auto &x: S){
cout<<x<<" ";
}
cout<<endl;
S.erase(S.find(1),S.end());
for(auto &x: S){
cout<<x<<" ";
}
}
输出:
64 1 100 10
64
这对每个 IDE 和每次都是一样的。
unordered_set
不是使用哈希吗?
而 hash 没有顺序。
确实是一个糟糕的名字。我相信 C++ 标准委员会想称它为 std::hash_set
,但在 C++11 中标准化之前流通的 so-called std::hash_set
太多了。这同样适用于 std::unordered_map
:请参阅针对 C++03 及更早版本的 Boost 发行版的 hash_map
。
就哈希桶的顺序而言,它们确实是有序的,但需要说明的重点是您不应该关心顺序。
(幸运的是,在 C++17 中 boost::optional
变成了 std::optional
:希望吸取教训,避免像 std::discretionary
这样的事情。)
This is same for every IDE and for every time.
不承诺元素的顺序与每次都承诺不同的顺序不同。
And hash don't have an order.
有元素,可以迭代。那是 一个 顺序。它们不符合自然顺序。
哈希是确定性的,所以unordered_set是确定性的,否则你将无法检索集合中的元素。
您看到的顺序只是 unordered_set 中存储桶的内容,如果 unordered_set 决定调整大小,顺序可以更改。
int main(){
unordered_set<int> S;
S.insert(1);
S.insert(10);
S.insert(100);
S.insert(64);
for(auto &x: S){
cout<<x<<" ";
}
cout<<endl;
S.erase(S.find(1),S.end());
for(auto &x: S){
cout<<x<<" ";
}
}
输出:
64 1 100 10
64
这对每个 IDE 和每次都是一样的。
unordered_set
不是使用哈希吗?
而 hash 没有顺序。
确实是一个糟糕的名字。我相信 C++ 标准委员会想称它为 std::hash_set
,但在 C++11 中标准化之前流通的 so-called std::hash_set
太多了。这同样适用于 std::unordered_map
:请参阅针对 C++03 及更早版本的 Boost 发行版的 hash_map
。
就哈希桶的顺序而言,它们确实是有序的,但需要说明的重点是您不应该关心顺序。
(幸运的是,在 C++17 中 boost::optional
变成了 std::optional
:希望吸取教训,避免像 std::discretionary
这样的事情。)
This is same for every IDE and for every time.
不承诺元素的顺序与每次都承诺不同的顺序不同。
And hash don't have an order.
有元素,可以迭代。那是 一个 顺序。它们不符合自然顺序。
哈希是确定性的,所以unordered_set是确定性的,否则你将无法检索集合中的元素。
您看到的顺序只是 unordered_set 中存储桶的内容,如果 unordered_set 决定调整大小,顺序可以更改。