Telegram Group & Telegram Channel
📌 Как эффективно работать с std::unordered_map?

Всем привет! Сегодня расскажу о том, как правильно работать с std::unordered_map, чтобы избежать неожиданных проблем с производительностью.

🔥 Почему std::unordered_map?
std::unordered_map — это хеш-таблица в C++, обеспечивающая быстрый доступ к данным (O(1) в среднем). В отличие от std::map, который построен на красно-черном дереве (O(log N) доступ), unordered_map работает быстрее при больших объемах данных.

⚠️ Подводные камни и советы по оптимизации

1️⃣ Выбор хорошей хеш-функции
Стандартные хеш-функции (`std::hash`) работают хорошо для примитивных типов, но если вы работаете со сложными структурами (например, std::pair или std::string), лучше использовать специализированные хешеры.


struct MyHash {
std::size_t operator()(const std::pair<int, int>& p) const {
return std::hash<int>()(p.first) ^ (std::hash<int>()(p.second) << 1);
}
};

Использование ^ (xor) и сдвигов помогает уменьшить коллизии.

2️⃣ Избегайте частых рехеширований
При вставке элементов хеш-таблица может перераспределять память (rehash), что затратно. Лучше заранее задать нужный размер:

std::unordered_map<int, std::string> myMap;
myMap.reserve(10000); // Уменьшаем количество рехеширований

Это особенно полезно, если вы примерно знаете, сколько элементов будет в контейнере.

3️⃣ Оптимизация использования памяти
Если ваш unordered_map хранит тяжелые структуры, можно использовать std::reference_wrapper или хранить данные по shared_ptr:

std::unordered_map<int, std::shared_ptr<MyStruct>> myMap;

Так вы избежите лишнего копирования.

4️⃣ Правильное использование find
Перед operator[] всегда проверяйте, есть ли элемент в контейнере. Так вы избежите ненужных вставок:

if (myMap.find(key) != myMap.end()) {
// Обрабатываем существующий ключ
}

Или используйте try_emplace, чтобы избежать двойного вычисления ключа:

myMap.try_emplace(key, "значение по умолчанию");


📌 Вывод:
std::unordered_map — мощный инструмент, но при неправильном использовании может работать неэффективно. Выбирайте хорошие хеш-функции, контролируйте рехеширование и оптимизируйте память.

➡️ @cpp_geek



tg-me.com/cpp_geek/290
Create:
Last Update:

📌 Как эффективно работать с std::unordered_map?

Всем привет! Сегодня расскажу о том, как правильно работать с std::unordered_map, чтобы избежать неожиданных проблем с производительностью.

🔥 Почему std::unordered_map?
std::unordered_map — это хеш-таблица в C++, обеспечивающая быстрый доступ к данным (O(1) в среднем). В отличие от std::map, который построен на красно-черном дереве (O(log N) доступ), unordered_map работает быстрее при больших объемах данных.

⚠️ Подводные камни и советы по оптимизации

1️⃣ Выбор хорошей хеш-функции
Стандартные хеш-функции (`std::hash`) работают хорошо для примитивных типов, но если вы работаете со сложными структурами (например, std::pair или std::string), лучше использовать специализированные хешеры.


struct MyHash {
std::size_t operator()(const std::pair<int, int>& p) const {
return std::hash<int>()(p.first) ^ (std::hash<int>()(p.second) << 1);
}
};

Использование ^ (xor) и сдвигов помогает уменьшить коллизии.

2️⃣ Избегайте частых рехеширований
При вставке элементов хеш-таблица может перераспределять память (rehash), что затратно. Лучше заранее задать нужный размер:

std::unordered_map<int, std::string> myMap;
myMap.reserve(10000); // Уменьшаем количество рехеширований

Это особенно полезно, если вы примерно знаете, сколько элементов будет в контейнере.

3️⃣ Оптимизация использования памяти
Если ваш unordered_map хранит тяжелые структуры, можно использовать std::reference_wrapper или хранить данные по shared_ptr:

std::unordered_map<int, std::shared_ptr<MyStruct>> myMap;

Так вы избежите лишнего копирования.

4️⃣ Правильное использование find
Перед operator[] всегда проверяйте, есть ли элемент в контейнере. Так вы избежите ненужных вставок:

if (myMap.find(key) != myMap.end()) {
// Обрабатываем существующий ключ
}

Или используйте try_emplace, чтобы избежать двойного вычисления ключа:

myMap.try_emplace(key, "значение по умолчанию");


📌 Вывод:
std::unordered_map — мощный инструмент, но при неправильном использовании может работать неэффективно. Выбирайте хорошие хеш-функции, контролируйте рехеширование и оптимизируйте память.

➡️ @cpp_geek

BY C++ geek


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/cpp_geek/290

View MORE
Open in Telegram


telegram Telegram | DID YOU KNOW?

Date: |

The SSE was the first modern stock exchange to open in China, with trading commencing in 1990. It has now grown to become the largest stock exchange in Asia and the third-largest in the world by market capitalization, which stood at RMB 50.6 trillion (US$7.8 trillion) as of September 2021. Stocks (both A-shares and B-shares), bonds, funds, and derivatives are traded on the exchange. The SEE has two trading boards, the Main Board and the Science and Technology Innovation Board, the latter more commonly known as the STAR Market. The Main Board mainly hosts large, well-established Chinese companies and lists both A-shares and B-shares.

The seemingly negative pandemic effects and resource/product shortages are encouraging and allowing organizations to innovate and change.The news of cash-rich organizations getting ready for the post-Covid growth economy is a sign of more than capital spending plans. Cash provides a cushion for risk-taking and a tool for growth.

telegram from ru


Telegram C++ geek
FROM USA