Junior
C++-ში map და unordered_map კონტეინერების შორის რა განსხვავებაა?
sobes.tech AI
პასუხი AI-სგან
ძირითადი განსხვავება იმაშია, როგორ ინახება და მიიღება ელემენტები:
std::map: ინახავს ელემენტებს გასაღებების მიხედვით სორტირებულად. ჩვეულებრივ, რეალიზებულია წითელი-შავი ხის საფუძველზე. ძიება, დამატება და წაშლა აქვს ლოგარითმული სირთულე O(log N), სადაც N - ელემენტების რაოდენობა.std::unordered_map: ინახავს ელემენტებს ჰეშ-ტაბლაში. წესრიგი შემთხვევითია. საშუალოდ, ძიება, დამატება და წაშლა აქვს კონსტანტული სირთულე O(1). უარეს შემთხვევაში, კოლიზიების არსებობისას, სირთულე შეიძლება მიაღწიოს O(N)-ს.
| ნიშანი | std::map |
std::unordered_map |
|---|---|---|
| წესრიგი | კილტზე (ზრდადობით) | არა |
| ძირითადი სტრუქტურა | წითელი-შავი ხე | ჰეშ-ტაბლია |
| საშუალო სირთულე | O(log N) | O(1) |
| უარესი სირთულე | O(log N) | O(N) |
| კილტის მოთხოვნა | < ოპერატორი |
ჰეშ-ფუნქცია და == |
გამოყენების მაგალითი:
#include <map>
#include <unordered_map>
#include <string>
#include <iostream>
int main() {
// std::map: ელემენტები კილტზე სორტირებულია
std::map<std::string, int> სორტირებული_გრაფა;
სორტირებული_გრაფა["ბანანი"] = 3;
სორტირებული_გრაფა["ვაშლი"] = 1;
სორტირებული_გრაფა["ჩერი"] = 2;
// გამოტანა: ვაშლი 1, ბანანი 3, ჩერი 2 (სორტი მნიშვნელოვანია)
for (const auto& წყვილი : სორტირებული_გრაფა) {
std::cout << წყვილი.first << " " << წყვილი.second << std::endl;
}
std::cout << "---" << std::endl;
// std::unordered_map: ელემენტების წესრიგი არ არის გარანტირებული
std::unordered_map<std::string, int> თავისუფალი_გრაფა;
თავისუფალი_გრაფა["ბანანი"] = 3;
თავისუფალი_გრაფა["ვაშლი"] = 1;
თავისუფალი_გრაფა["ჩერი"] = 2;
// გამოტანა შეიძლება იყოს განსხვავებული (მაგალითად, ჩერი 2, ვაშლი 1, ბანანი 3)
for (const auto& წყვილი : თავისუფალი_გრაფა) {
std::cout << წყვილი.first << " " << წყვილი.second << std::endl;
}
return 0;
}