/*一直不大了解multimap的应用原理,做了个简陋的电话薄尝试了一下。
总的来说,multimap的成员是单独的pair类型,与map不同的是,multimap不支持下标运算,因为其一个键可以对应多个实例(值)。
因此,处理这些实例就多了许多的麻烦。然而,关联容器的内容在内存中不是连续储存的,只有相同键的多个实例会被放在一起,当从begin()向end()输出的时候,系统会自动进行字典排序处理。这时,想找到相同的键对应的值就简单了很多。有一个很重要的函数m.equal_range( k ) 返回一个迭代器的pair对象,它的first成员等价于m.lower_bound(k) , second成员则等价于m.upper_bound( k )。这时就可以通过迭代器很容易的进行迭代器++以及erase( )或读取功能了。
同时,应该注意的一点是,带有一个键参数的erase版本将删除拥有该键的所有元素,并返回删除个数。而带有一个或一对迭代器参数的版本只删除特定的元素,并返回void 。因此,删除数据时使用迭代器未免不是一个好的选择。
以下是源码:*/
-------------/*Book.cpp*/---------------- #include "stdafx.h" #include"Book.h" void Phone_book::put(multimap<string,long long> &book) { for(multimap<string,long long>::iterator putter=book.begin();putter!=book.end();putter++) cout<<putter->first<<setw(15)<<putter->second<<endl; } void Phone_book::add(multimap<string,long long> &book) { system("cls"); cout<<"Put name and phone number(one name can connect more number):"; put(book); string name; long long number; while(cin>>name>>number) { if(name=="0") break; book.insert(make_pair(name,number)); } multimap<string,long long>::iterator sel; for(sel=book.begin();sel!=book.end();sel++) { cout<<sel->first<<setw(15)<<sel->second<<endl; } } void Phone_book::select(multimap<string,long long> &book) { typedef multimap<string,long long>::iterator iter; system("cls"); cout<<"Who do you want to select"<<endl; string sel_name; cin>>sel_name; pair<iter,iter> pos=book.equal_range(sel_name); for(iter sel=pos.first;sel!=pos.second;sel++) { cout<<sel->first<<setw(15)<<sel->second<<endl; } } void Phone_book::erase(multimap<string,long long> &book) { typedef multimap<string,long long>::iterator iter; system("cls"); cout<<"Who do you want to erase"<<endl; put(book); string era_name; cin>>era_name; pair<iter,iter> pos=book.equal_range(era_name); cout<<era_name<<endl; int item=1; for(iter era=pos.first;era!=pos.second;era++,item++) { cout<<'['<<item<<']'<<" "<<era->second<<endl; } int option; cin>>option; iter era=pos.first; while(--option) era++; book.erase(era); }
--------/*Book.h*/--------- #ifndef BOOK_H #define BOOK_H #include<iostream> #include<map> #include<string> #include<iomanip> #include<utility> using namespace std; class Phone_book { public: void add(multimap<string,long long> &); void select(multimap<string,long long> &); void erase(multimap<string,long long> &); void put(multimap<string,long long> &); }; #endif------------/*main.cpp*/------------ #include "stdafx.h" #include<conio.h> #include"Book.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { multimap<string,long long> Pb; cout<<"Welcome to your Phone Book"<<endl<<endl; while(1) { cout<<"[1] select [2] add [3] erase"<<endl; Phone_book new_book; int option; option=_getch()-48; switch(option) { case 1:new_book.select(Pb);break; case 2:new_book.add(Pb);break; case 3:new_book.erase(Pb);break; } } return 0; }
multimap应用
最新推荐文章于 2023-09-30 16:15:59 发布