Nếu bạn muốn kết hợp giá trị với chỉ mục và tìm chỉ mục nhanh chóng, bạn có thể sử dụng std::map
hoặc std::unordered_map
. Bạn cũng có thể kết hợp chúng với các cấu trúc dữ liệu khác (ví dụ: std::list
hoặc std::vector
) tùy thuộc vào các hoạt động khác mà bạn muốn thực hiện trên dữ liệu.
Ví dụ, khi tạo vector chúng tôi cũng tạo ra một bảng tra cứu:
vector<int> test(test_size);
unordered_map<int, size_t> lookup;
int value = 0;
for(size_t index = 0; index < test_size; ++index)
{
test[index] = value;
lookup[value] = index;
value += rand()%100+1;
}
Bây giờ để tìm kiếm các chỉ số bạn chỉ đơn giản là:
size_t index = lookup[find_value];
Sử dụng một bảng băm cấu trúc dữ liệu dựa (ví dụ unordered_map) là một sự cân bằng không gian/thời gian khá cổ điển và có thể hoạt động tốt hơn khi thực hiện tìm kiếm nhị phân cho loại hoạt động tra cứu "đảo ngược" này khi bạn cần thực hiện nhiều tra cứu. Ưu điểm khác là nó cũng hoạt động khi véc tơ được phân loại.
Đối với niềm vui :-) tôi đã thực hiện một chuẩn mực nhanh chóng trong VS2012RC so sánh mã tìm kiếm nhị phân James' với một tìm kiếm tuyến tính và với việc sử dụng unordered_map cho tra cứu, tất cả trên một vector: 
Để ~ 50000 yếu tố unordered_set đáng kể (x3-4) vượt trội so với tìm kiếm nhị phân biểu hiện hành vi O (log N), kết quả hơi ngạc nhiên là unordered_map mất hành vi O (1) của nó vượt quá 10000 phần tử, có lẽ do va chạm băm, có lẽ là thực hiện vấn đề.
CHỈNH SỬA: max_load_factor() cho bản đồ không có thứ tự là 1 vì vậy sẽ không có xung đột. Sự khác biệt về hiệu suất giữa tìm kiếm nhị phân và bảng băm cho các vectơ rất lớn dường như là bộ nhớ đệm có liên quan và thay đổi tùy thuộc vào mẫu tra cứu trong điểm chuẩn.
Choosing between std::map and std::unordered_map nói về sự khác biệt giữa bản đồ đặt hàng và không có thứ tự.
Nguồn
2012-07-07 22:10:36
có thực hiện việc biên dịch này không? – Ulterior
@Ulterior: Có, đó là bản sao-pasta'ed từ thư viện CxxReflect của tôi. Xem [algorithm.hpp] (http://cxxreflect.codeplex.com/SourceControl/changeset/view/8ffbb562ad38#cxxreflect%2fcore%2falgorithm.hpp). –
Tại sao nó không biên dịch? Tôi thấy không có bằng chứng về lỗi. – Puppy