2010-07-30 48 views
8

Các đối tượng do người dùng xác định được sắp xếp trong bản đồ và được đặt như thế nào? Theo như tôi biết, bản đồ/bộ được sắp xếp Liên kết vùng chứa: các yếu tố được chèn được sắp xếp dựa trên khóa mà nó nắm giữ.Sắp xếp thứ tự trong bản đồ STL và đặt

Nhưng bản đồ và đặt sử dụng nội bộ operator > để sắp xếp các yếu tố của chúng.

Từ trang web của SGI, tôi có các ví dụ sau đây:

struct ltstr 
{ 
    bool operator()(const char* s1, const char* s2) const 
    { 
     return strcmp(s1, s2) < 0; 
    } 
}; 

int main() 
{ 
    map<const char*, int, ltstr> months; 

    months["january"] = 31; 
    months["february"] = 28; 
    months["march"] = 31; 
    months["april"] = 30; 
    months["may"] = 31; 
    months["june"] = 30; 
    months["july"] = 31; 
    months["august"] = 31; 
    months["september"] = 30; 
    months["october"] = 31; 
    months["november"] = 30; 
    months["december"] = 31; 

    cout << "june -> " << months["june"] << endl; 

    map<const char*, int, ltstr>::iterator cur = months.find("june"); 
    map<const char*, int, ltstr>::iterator prev = cur; 
    map<const char*, int, ltstr>::iterator next = cur; 

    ++next; 
    --prev; 

    cout << "Previous (in alphabetical order) is " << (*prev).first << endl; 
    cout << "Next (in alphabetical order) is " << (*next).first << endl; 
} 

Trong ví dụ trên, như thế nào là giá trị được sắp xếp?

Chỉnh sửa: Mã chuyển từ bình luận:

typedef map <string, int> Mint ; 

int main() 
{ 
    string Name ; 
    int Marks; 
    Mint Grade; 
    for (int i = 0; i<4; i++) 
    { 
     cin>> Name ; 
     cin >> Marks; 
     Grade [Name] = Marks ; 
    } 
    Mint :: iterator iter; 
    for(iter = Grade.begin(); iter != Grade.end(); iter++) 
     cout<< (*iter).first<<“ \t ” <<(*iter).second<<“\n” ; 
    return 0; 

} 

Làm thế nào sẽ các giá trị được sắp xếp?

Trả lời

8

std::map sử dụng trình rút gọn để sắp xếp các yếu tố. Theo mặc định là std::less<Key> sử dụng operator<. Trong mẫu của bạn, có một người dùng được định nghĩa là functor ltstr sẽ giúp sắp xếp các phần tử theo các khóa của nó theo thứ tự bảng chữ cái.

+0

Vì vậy, bản đồ cơ bản sử dụng khóa để sắp xếp các giá trị dựa trên std :: less sử dụng toán tử ronan

+1

Có, nó sử dụng 'toán tử <' ở cuối nếu bạn không chỉ rõ đối số mẫu. –

+0

@Kirill Nó sử dụng bộ so sánh để so sánh các phím không phải là phần tử. – DumbCoder

3

Trước hết, operator< được sử dụng theo mặc định chứ không phải operator>. Trong trường hợp của bạn, bạn đang chuyển một hàm so sánh tùy chỉnh bằng cách chuyển tham số mẫu thứ ba trong khi tạo đối tượng bản đồ. Trong khi chèn từng phần tử vào bản đồ, hàm functor so sánh này được sử dụng để xác định thứ tự tương đối của đối tượng trong bản đồ, tức là nó được sử dụng để so sánh các khóa. Ví dụ: khi bạn làm months["february"] = 28;, bản đồ so sánh các phím "tháng một" và "tháng hai". Vì chúng ta đang so sánh chuỗi, so sánh này trả về một giá trị lớn hơn 0. Giá trị này được sử dụng để xác định vị trí của khóa "tháng hai" liên quan đến "tháng một".

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