2013-02-16 26 views
6

Tôi đang tạo một số std::map<int, int> bằng C++ mà tôi muốn chúng được sắp xếp từ cao nhất đến thấp nhất thay vì thứ tự sắp xếp mặc định. Nghiên cứu của tôi đưa tôi đến với std::greater trông đầy hứa hẹn nhưng khi cố gắng sử dụng nó Tôi nhận được một lỗi biên dịch:Cách sắp xếp các phím bản đồ C++ với tiêu chuẩn :: lớn hơn?

invalid type argument of unary ‘*’ (have ‘int’)

khai bản đồ của tôi là:

std::map<int, int, std::greater<int> > numMap; 

Và lỗi là nhận được ném từ này chức năng:

void Row::addNumber(int num, int pos) { 
    numMap.insert(num, pos); 
} 

câu trả lời cho câu hỏi tương tự như this bao gồm ngoặc trong việc kê khai, tức là std :: hơn () - nhưng khi tôi bao gồm những lỗi đó, tôi nhận được nhiều lỗi liên quan đến một hàm trả về một hàm.

+0

vấn đề của bạn không được giải quyết khi bạn đọc bản đồ ngược? chỉ nói. – fonZ

+0

Bạn có nói rằng bạn không nhận được cùng một lỗi khi bạn sử dụng so sánh mặc định 'std :: map'? Bởi vì điều đó không quan trọng một chút trong trường hợp này. –

Trả lời

7

Sự cố - gọi hàm std::map::insert thành viên có thông số không hợp lệ: có hai giá trị số nguyên được cung cấp; nhưng có phải làstd::pair<int, int>. Vui lòng xem tài liệu tham khảo: std::map::insert.

lựa chọn Ưu tiên

Đối tiện (chỉ không để lặp lại các thông số loại bản đồ), tạo ra một typedef cho bản đồ:

typedef std::map<int, int> IntMap; 

Các std::map đã gõ định nghĩa cho std::pair (cặp đại diện) - std::map::value_type. Ví dụ: nếu có std::map<int, int>, std::map::value_type sẽ là std::pair<int, int>.

Sử dụng std::map::value_type constructor (IntMap::value_type trong trường hợp này):

class Row { 
public: 
    void Row::addNumber(int num, int pos) 
    { 
     m_numMap.insert(IntMap::value_type(num, pos)); 
    } 

private: 
    typedef std::map<int, int> IntMap; 
    IntMap m_numMap; 
}; 

Alternatives:

  1. Sử dụng std::make_pair() chức năng:

    #include <utility> 
    
    ... 
    
    void Row::addNumber(int num, int pos) 
    { 
        numMap.insert(std::make_pair(num, pos)); 
    } 
    
  2. Trực tiếp sử dụng std::pair constructor:

    void Row::addNumber(int num, int pos) 
    { 
        numMap.insert(std::pair<int, int>(num, pos)); 
    } 
    
+0

Rất nhiều điều này. Hàm chèn không hoạt động theo cách bạn mong đợi. :( – Xymostech

+0

Ah cảm ơn, tôi đã giả định bản đồ C++ chèn chức năng giống như cách map.put của Java - rõ ràng tôi nên đã nghiên cứu rằng nhiều hơn :-( – Exupery

+1

@Exupery, bằng cách này, nếu bạn đã sử dụng 'HashMap' lớp trong Java , bạn có thể muốn sử dụng lớp 'std :: unordered_map' (có sẵn từ ** C++ 11 **) - thùng chứa bản đồ băm. –

5

pedantic hơn một chút so với câu trả lời của Sergey (mà cũng chắc chắn công trình), thay vì sử dụng:

typedef std::map<int, int, std::greater<int> > MyMap; 
MyMap numMap; 

void Row::addNumber(int num, int pos) 
{ 
    numMap.insert(MyMap::value_type(num, pos)); 
} 

Lợi ích là rằng nếu bạn thay đổi kiểu của bản đồ, bạn chỉ còn lại ít để thay đổi sau này. Và ít khả năng hơn nhưng vẫn có thể, nếu việc thực hiện std::map thay đổi value_type từ std::pair sang một thứ khác (trong phiên bản tương lai của stl), bạn không thể thay đổi được điều đó.

+0

+1, vâng, bạn nói đúng: 'std :: map :: value_type' rất tiện lợi (không lặp lại tham số của' std :: map' type). –

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