2010-02-01 85 views
43

Tôi không biết cách sử dụng hàm băm trong C++, nhưng tôi biết rằng chúng ta có thể sử dụng hash_map. G ++ có hỗ trợ bằng cách đơn giản bao gồm #include <hash_map> không? Ví dụ đơn giản sử dụng hash_map là gì?Tôi muốn xem ví dụ hash_map trong C++

+8

@BlueRaja: Đúng vậy, việc sử dụng nó dẫn đến sự nhầm lẫn tuyệt vời như vậy khi mọi người tin rằng 'hash_map' thực sự là một phần của C++. Tôi nghĩ điều này, giống như bất kỳ câu hỏi liên quan đến lập trình nào khác, là ngay tại nhà ở đây trên SO, phải không? Nói cho mọi người sử dụng Google là một sự lãng phí của họ và thời gian của chúng tôi. Của họ bởi vì họ phải sàng lọc hàng ngàn câu trả lời không chính xác và không đáng tin cậy, và của chúng tôi bởi vì chúng tôi sau đó phải phá bỏ tất cả các quan niệm sai lầm và thực hành xấu của họ khi họ đến đây để đặt câu hỏi sau. – jalf

+1

@jalf: như thể các câu trả lời trên SO được đảm bảo chính xác và đáng tin cậy. –

+11

Họ được đảm bảo để được nhìn thấy và bình chọn bởi các lập trình viên khác, điều này khiến họ trở nên đáng tin cậy hơn hầu hết những gì một người mới bắt đầu có thể tìm kiếm một cách mù quáng trên Google. – jalf

Trả lời

50

C hiện ++ tiêu chuẩn không có bản đồ băm, nhưng đến tiêu chuẩn C++ 0x làm, và những đã được hỗ trợ bởi g ++ trong hình dạng của "bản đồ có thứ tự":

#include <unordered_map> 
#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    unordered_map <string, int> m; 
    m["foo"] = 42; 
    cout << m["foo"] << endl; 
} 

Để để có được biên dịch này, bạn cần phải nói với g ++ mà bạn đang sử dụng C++ 0x:

g++ -std=c++0x main.cpp 

Những bản đồ này làm việc khá nhiều như std :: bản đồ thực hiện, ngoại trừ việc thay vì cung cấp một tùy chỉnh operator<() với nhiều loại của riêng bạn , bạn cần cung cấp hàm băm tùy chỉnh - suitab Các hàm le được cung cấp cho các kiểu như số nguyên và chuỗi.

+0

+1: bạn nên chỉnh sửa câu trả lời đó để đề cập đến TR1 mặc dù ... –

+1

@Kornel Không, tôi không nên. TR1 chưa bao giờ được phê chuẩn - không gian tên tr1 chỉ là một phần mở rộng mà trình biên dịch cung cấp. Tôi không bao giờ sử dụng nó trong mã của riêng tôi. –

+0

@Neil, sooo, một người sử dụng GCC 3.4, MSVC và các trình biên dịch khác không phải C++ 0x không nên sử dụng TR1, nhưng vui lòng đợi cho đến khi mở rộng thư viện C++ 0x ra khỏi hộp? –

9

#include <tr1/unordered_map> sẽ giúp bạn đạt tiêu chuẩn tiếp theo C++ unique hash container. Cách sử dụng:

std::tr1::unordered_map<std::string,int> my_map; 
my_map["answer"] = 42; 
printf("The answer to life and everything is: %d\n", my_map["answer"]); 
+3

Đầu ra kiểu C với hộp chứa kiểu C++? Ouch! – Bill

+22

Chào mừng bạn đến với thế giới thực :) –

1

Tên chấp nhận vào TR1 (và dự thảo cho các tiêu chuẩn tiếp theo) là std::unordered_map, vì vậy nếu bạn đã có sẵn, nó có thể là một trong những bạn muốn sử dụng.

Ngoài ra, sử dụng nó là rất nhiều như sử dụng std::map, với điều kiện là khi/nếu bạn đi qua các mục trong một std::map, họ đi ra theo trình tự quy định của operator<, nhưng đối với một unordered_map, thứ tự là nói chung là vô nghĩa.

Các vấn đề liên quan