Використовуйте встановити, коли:
- Нам потрібні впорядковані дані (окремі елементи).
- Нам доведеться роздрукувати / отримати доступ до даних (у відсортованому порядку).
- Нам потрібен попередник / наступник елементів.
Використовуйте не упорядкований_сет, коли:
- Нам потрібно зберегти набір чітких елементів і замовлення не потрібно.
- Нам потрібен одноелементний доступ, тобто відсутність проходу.
Приклади:
набір:
Вхід: 1, 8, 2, 5, 3, 9
Вихід: 1, 2, 3, 5, 8, 9
Не упорядкований_сет:
Вхід: 1, 8, 2, 5, 3, 9
Вихід: 9 3 1 8 2 5 (можливо, цей порядок, під впливом хеш-функції)
В основному різниця:
Примітка: (в деяких випадках set
зручніше), наприклад, використання vector
ключа
set<vector<int>> s;
s.insert({1, 2});
s.insert({1, 3});
s.insert({1, 2});
for(const auto& vec:s)
cout<<vec<<endl; // I have override << for vector
// 1 2
// 1 3
Причина, чому vector<int>
може бути ключовою, set
тому що vector
переосмислити operator<
.
Але якщо ви використовуєте, unordered_set<vector<int>>
ви повинні створити хеш-функцію для vector<int>
, тому що вектор не має хеш-функції, тож вам слід визначити такий, як:
struct VectorHash {
size_t operator()(const std::vector<int>& v) const {
std::hash<int> hasher;
size_t seed = 0;
for (int i : v) {
seed ^= hasher(i) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
return seed;
}
};
vector<vector<int>> two(){
//unordered_set<vector<int>> s; // error vector<int> doesn't have hash function
unordered_set<vector<int>, VectorHash> s;
s.insert({1, 2});
s.insert({1, 3});
s.insert({1, 2});
for(const auto& vec:s)
cout<<vec<<endl;
// 1 2
// 1 3
}
ви можете бачити, що в деяких випадках unordered_set
складніше.
В основному цитується з:
https://www.geeksforgeeks.org/set-vs-unordered_set-c-stl/
https://stackoverflow.com/a/29855973/6329006