unordered_map тормозит?
От: f95.2  
Дата: 21.04.20 20:31
Оценка:
Добрый вечер.
Я, конечно, слышал (краем уха) жалобы, что из-за текущих ограничений в c++ нельзя реализовать быстрый map на хеш-таблицах.
(хотя не разбирался толком, что это за ограничения и как они мешают )

Но не думал, что всё настолько плохо. Или я чего-то не понимаю?

Вот есть простенькая задачка с литкода: https://leetcode.com/problems/two-sum/
Мое решение на c++:
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> map;
        map.reserve(nums.size());

        for (int i = 0; i < nums.size(); ++i) {
            int other_part = target - nums[i];

            auto position_iter = map.find(other_part);
            if (position_iter != map.end()) {
                return vector<int>{position_iter->second, i};
            } else {
                 map.emplace(nums[i], i);
            }
        }

        return vector<int>{};
    }
};


И на java:
class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap map = new HashMap<Integer, Integer>();

        for (int i = 0; i < nums.length; ++i) {
            int other_part = target - nums[i];

            Integer position = (Integer) map.get(other_part);
            if (position != null) {
                return new int[]{position, i};
            } else {
                map.put(nums[i], i);
            }
        }

        return new int[]{0, 0};
    }
}


Решение на java отрабатывает за 1-2ms, а на плюсах — за 8...

Почему так может быть? Я что-то где-то неоптимально делаю? Может, на разных машинах тестируются?
Или unordered_map действительно настолько плох, что проигрывает java'вскому HashMap, которому даже boxing-unboxing не мешает?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.