2014-09-16 14 views
5

Tôi đang sử dụng phương thức find() của std::map, trả về một bộ chuyển đổi lặp.
Tuy nhiên, tôi cần chỉ số của phần tử tìm thấy; ví dụ: 0, tương ứng với std::map::begin(), v.v.In chỉ mục của một trình lặp trong std :: map

#include <map> 
#include <utility> 
#include <iostream> 

int main() 
{ 
    std::map< int, int > aMap; 
    aMap.insert(std::make_pair(100, 50)); 
    aMap.insert(std::make_pair(200, 40)); 
    aMap.insert(std::make_pair(300, 60)); 

    std::map< int, int >::iterator it_map = aMap.find(300); 
    if (it_map != aMap.end()) 
    std::cout << it_map << "\n"; // error 

} 

Điều đó không biên dịch và tôi biết lý do. Tuy nhiên, tôi cần một cách để in 2 vì chỉ mục 300 là 2.

Ví dụ đơn giản, bạn có thể nói rằng bản đồ (cây nhị phân) không phải là một vùng chứa tốt. Tuy nhiên, trong mã thực sự, có rất nhiều yếu tố mà tôi phải tìm kiếm và cây nhị phân là tốt cho điều đó.

Bất kỳ ý tưởng nào?

+2

Làm thế nào bạn xác định các chỉ số của một cấu trúc cây nhị phân ? – 101010

+0

@ 40two: Bản đồ không nhất thiết phải được triển khai dưới dạng cây và không có giao diện giống cây; nhưng nó được đặt hàng, vì vậy bạn có thể xác định một chỉ mục theo thứ tự như câu hỏi mô tả. –

+0

@MikeSeymour Theo tiêu chuẩn, nó không nhất thiết phải được thực hiện như một cái cây, đồng ý. Tuy nhiên, trong mọi lần thực hiện tôi biết được thực hiện như một cái cây. Hơn nữa, khi chèn hoặc trích xuất xảy ra, bất kỳ lệnh nào trước đó đều bị xáo trộn. Do đó, như câu trả lời của bạn một cách chính xác nói rằng bạn có thể định nghĩa một chỉ mục nhưng chỉ cho trạng thái xu hướng 'std :: map'. – 101010

Trả lời

7

Nếu bạn cần chỉ mục, thì có lẽ bản đồ là loại dữ liệu sai; bạn cần phải lặp qua bản đồ (trong thời gian tuyến tính) để tìm chỉ mục, mất đi lợi ích của việc tìm kiếm logarit-time.

Có lẽ một véc tơ được sắp xếp, sử dụng thuật toán lower_bound để tìm các phần tử trong thời gian logarit, có thể phù hợp hơn. Sau đó, bạn có thể trừ phép lặp truy cập ngẫu nhiên kết quả từ trình lặp lặp begin() trong thời gian không đổi.

Tuy nhiên, nếu bạn muốn sử dụng bản đồ:

std::cout << std::distance(aMap.begin(), it_map) << '\n'; 
5

Sử dụng std::distance, như thế này:

std::cout << std::distance(std::begin(aMap),it_map) << endl; 

Documentation here

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