Xem mẫu
- LẬP TRÌNH C/C++ NÂNG CAO
Yêu cầu trước khi đọc: học xong Lập trình C/C++ căn bản
BÀI 11 – ASSOCIATIVE CONTAINER (CÁC BỘ LƯU TRỮ LIÊN
KẾT)
Bao gồm map (ánh xạ) multimap (đa ánh xạ) set (tập hợp) multiset (đa tập
hợp)
Sự khác nhau giữa các associative container và sequential container ở một
điểm:
-các sequential container lưu trữ các phần tử (gọi là các value) và các value
này được truy xuất tuần tự theo vị trí của chúng trong
bộ lưu trữ
-các associative container lưu trữ các phần tử (gọi là các value) và các khóa
(gọi là các key) liên kết với các value và các value này
được truy xuất theo các key mà chúng có liên kết
Map
CODE
#include
map ánh xạ từ một char* đến một int
map mapInt;
mapInt["one"] = 1;
cout
- };
typedef map MP;
typedef MP::iterator MPI;
typedef MP::const_iterator MPCI;
typedef MP::value_type MPVT;
void display(const MP& mp)
{
for(MPCI i=mp.begin();i!=mp.end();++i) cout
- Dùng comparator để so sánh
CODE
class comparePerson
{
public:
bool operator()(Person p1,Person p2){
return p1.name.compare(p2.name);
}
};
typedef map MAP;
MAP pMap;
Person p=new Person(...);
MAP::iterator i=pMap.find(d);
if(i==pMap.end()) pMap.insert(MAP::value_type(d,1));
Dùng comparator để sắp xếp
CODE
class comparePerson
{
public:
bool operator()(const Person& p1,const Person& p2)
{
return p1.name.compare(p2.name);
}
};
typedef map MP;
MP mapPerson;Person p("Viet");
mapPerson.insert(pair("one",Person("Nam")));
mapPerson.insert(pair("two",Person("Viet")));
mapPerson.insert(pair("three",Person("An")));
display(mapPerson);
Bạn lưu ý là tất cả các asociative container đều có xây dựng sẵn comparator
mặc định là less (trong thư viện functional)
- Nghĩa là khi bạn khai báo
CODE
map mapInt;
thực ra là
CODE
map mapInt;
Ví dụ
CODE
typedef map MI;
typedef map::iterator MII;
MI m;m["c"] = 1;m["b"] = 2;m["a"] = 3;
for(MII i=m.begin();i!=m.end();++i)
cout
- p.sort(AgeSort());//using sort with comparator
for(LP::const_iterator i=p.begin();i!=p.end();++i) cout
- multiset
multiset cũng giống set ngoại trừ một điều, mỗi key có thể ánh xạ đến nhiều
hơn một value, nói cách khác là nhiều value trong
multiset có chung một key
Bạn có thể thắc mắc điều này chẳng có ý nghĩa gì, vì trong set thì key cũng
chính là value, Không, chúng có khác đấy, thử xem
nhé:
CODE
#include
set s;
s.insert(1);
s.insert(1);
for(set::iterator i=s.begin();i!=s.end();++i) cout
nguon tai.lieu . vn