2011-10-23 25 views
7

Tôi đang tìm một chức năng trong C++ để hoán đổi nội dung của bản đồ ... nghĩa là: những khóa đã trở thành mục và rằng các vật phẩm bây giờ là chìa khóa. Bạn có thể cho tôi biết nếu có điều gì đó về điều này?Trao đổi khóa và giá trị của bản đồ bằng C++

+5

Bạn có thể muốn thực hiện việc này cho nhiều lần, vì các giá trị trong bản đồ không nhất thiết phải khác biệt. –

+0

Tôi chắc chắn rằng các giá trị của bản đồ của tôi là duy nhất: Không có trùng lặp – Safari

Trả lời

13

Như Geoffroy đã nói, std::map không cho phép hành vi này. Tuy nhiên, bạn có thể muốn sử dụng vùng chứa giống như STL Boost.Bimap - bản đồ hai chiều.

Bimap là cấu trúc dữ liệu đại diện cho quan hệ hai chiều giữa các thành phần của hai bộ sưu tập. Thùng chứa được thiết kế để hoạt động như hai bản đồ STL đối lập. Một bimap giữa bộ sưu tập X và bộ sưu tập Y có thể được xem dưới dạng bản đồ từ X sang Y (chế độ xem này sẽ được gọi là chế độ xem bản đồ bên trái) hoặc dưới dạng bản đồ từ Y sang X (được gọi là chế độ xem bản đồ bên phải).

1

Không có phương pháp/cách tiêu chuẩn để thực hiện việc này, bạn phải viết chức năng của riêng mình.

Đó không phải là điều khó làm, nhưng trước tiên hãy nghĩ đến việc thực hiện theo một cách khác.

Nếu bạn phải đảo ngược khóa/giá trị của mình, khi đó mã của bạn có thể bị lỗi, bạn không giữ được logic của vùng chứa.

Nếu bạn muốn biết thêm thông tin, hãy giải thích lý do bạn muốn thực hiện việc này.

+0

Tôi nghĩ rằng tăng có một bộ điều hợp lặp có thể làm cho điều này dễ dàng –

+0

Có lẽ, tôi không biết nhiều về việc tăng cường cho thời điểm này . Nhưng nó không quá khó để làm. – Geoffroy

+0

Tôi phải đọc một tập tin đã lấy chuỗi hàng-id. Tôi cần cho các thuật toán của tôi rằng giá trị này là một số nguyên (vì lý do hiệu quả và không phải là một chuỗi) sử dụng một bản đồ để liên kết với các chuỗi này một id duy nhất. Trong bản đồ để tôi intID-string. Tôi cần phải có kết quả của thuật toán của tôi trong id-string định dạng cũ của tôi vì vậy tôi có, cho mỗi chuỗi tìm kiếm IdInt trong tất cả các giá trị tương ứng của bản đồ. Để tăng tốc, điều này có thể thực hiện hoán đổi – Safari

1

Chèn các mục trong bản đồ vào giá trị nhiều giá trị đầu tiên, thứ hai, với hàm so sánh thích hợp so sánh hai giá trị của bản đồ gốc. Khi tất cả các mục khóa-giá trị được chèn vào, multimap sẽ được sắp xếp như dự định. Công việc hoàn thành!

1
template <class T1, class T2> 
map<T2, T1> swapPairs(map<T1, T2> m) { 
    map<T2, T1> m1; 

    for (auto&& item : m) { 
     m1.emplace(item.second, item.first); 
    } 

    return m1; 
}; 

int main() { 
    map<string, int> m; 
    m.emplace("111",5); 

    cout << m.at("111") << endl; // 5 

    map<int,string> m1 = swapPairs(m); 

    cout << m1.at(5) << endl; // 111 

    return 0; 
} 
Các vấn đề liên quan