Есть несколько элементов для повторения и поиска по ключу. И я уже составляю std::vector
для итерации. Мне нужно сформировать struct
для поиска, например std::unordered_map
?Выбор между std :: vector и std :: unordered_map Для поиска в нескольких случаях?
Я знаю, что поиск в std::vector
привел к O(N)
и выполнен в std::unordered_map
приведено в O(1)
. Но элементы внутри около 10. Никакая вставка или обновление не произошло после инициализации. Я могу искать много раз. Может быть, 1 миллион, 1 миллиард или даже больше, я не могу этого сделать.
Я обеспокоен тем, что хеширование может быть дороже, чем итерация.
Вот пример:
class Item
{
public:
int key;
const char* value;
};
class Items
{
public:
Items(const std::vector<const Item> items)
: _vector(items)
, _map(generateMap()){
}
const char* getValueByKey(int key) const {
//which one to choose
//map
// const auto& iter = _map.find(key);
// if (iter!=_map.end()) {
// return iter->second;
// }
// return nullptr;
//vector
for (const auto& iter : _vector) {
if (iter.key==key) {
return iter.value;
}
}
return nullptr;
}
protected:
const std::unordered_map<int, const char*> generateMap() const{
std::unordered_map<int, const char*> map;
for (const auto& item : _vector) {
map.insert({item.key, item.value});//I can make sure that no same key will exists
}
return map;
}
const std::vector<const Item> _vector;
const std::unordered_map<int, const char*> _map;//Is it necessary?
};
int main()
{
const std::vector<const Item> items ={
{1, "value_1"},
{20, "value_2"},
{10, "value_3"},
{55, "value_4"},
};
Items theItems = items;
srand(time(nullptr));
for (int i = 0; i < 1000000; i++) {
int key = rand();
printf("%d %s exists\n", key, theItems.getValueByKey(key)==nullptr?"is not":"is");
}
return 0;
}
Вот int
ключевой случай, может быть, не хеширования не произошло. Но как насчет других случаев, std::string
, пользовательский struct
и так далее?
Итак, как я должен принять мое решение для такого рода случая теоретически?
сравнить их, не думаю. Но проверяйте их только после того, как вы написали программу, и определили, что это немного код, который действительно оказывает значительное влияние на вашу общую производительность. – xaxxon
Почему вы исключаете * заказанную опцию '' std :: map'? Это хороший компромисс во многих ситуациях. –
@ A.S.H Почему 'std :: map' будет лучше? –