Добрый вечер.
Я, конечно, слышал (краем уха) жалобы, что из-за текущих ограничений в 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 не мешает?