C++の詳細に注目——STLのmap学習のまとめ
4693 ワード
mapでよく使われる方法は主にinsert,erease,size,count,begin,end,find,clear,emptyである.
Insertメソッド:
mapに1つの要素を挿入する、mapに記録された要素は通常キー値ペアであるため、記憶時にキーと値をpairにカプセル化して挿入する、例えばphone.insert(pair(name,number));ここでnameとnumberはstringタイプの変数です.もちろんphone[name]=numberと簡単に書くこともできます.ここでphoneはmapタイプの変数である.mapは実装中に[]を再ロードしたためである.
1つ目は、挿入された要素のキー値がmapにすでに存在すると、挿入に失敗し、要素のキー値対情報は変更されず、キー値がmapで見つからないと、その新しい要素がmapに追加されます.
第2の方法は比較的直感的であるが,性能の問題がある.2を挿入するときは、まずphoneでプライマリ・キーがnameのアイテムを検索しますが、見つかりませんでした.その後、新しいオブジェクトをphoneに挿入します.キーはnameで、値は空の文字列です.挿入が完了すると、文字列をnumberに割り当てます.この方法では、各値をデフォルト値に割り当て、表示された値に割り当てられます.要素がクラス・オブジェクトの場合、オーバーヘッドが大きくなります.キー値がnameの項目が見つかったらnumberで元のnumber値を変更します.
ereaseメソッド:
ereaseは主にmapの項目を削除し、phoneなどのパラメータkeyが必要です.erease(name);key値がnameのキー値ペアを削除することを意味します.
作者のブログ交流学習へようこそ:http://blog.csdn.net/IAccepted
sizeメソッド:
mapのキー値ペアの個数を統計しますphone.size()戻り値はphoneにおけるキー値ペアの個数であり、mapが空であれば0を返す
countメソッド:
mapのキー値の出現回数を統計する、mapのキー値が一意であるため、この方法は、削除時にphoneできるように、キー値が存在するか否かを検出するために使用することができる.count(name)は,0であればユーザにこのキー値が存在しないことを促すことができ,1であれば直接削除する.Ps:ereaseは、削除するキー値ペアが存在するかどうかにかかわらず正常に実行されます.
begin、endメソッド:
beginメソッドはmap反復器タイプを返し,endメソッドの戻り値と比較することでmapを容易に遍歴できる.
clearメソッド:
mapのすべての要素をクリア
作者のブログ交流学習へようこそ:http://blog.csdn.net/IAccepted
Emptyメソッド:
mapが空かどうかを判断し、空であれば真を返し、空でなければ偽を返す.
Ps:mapにはキー値ペアが格納されているため、反復器がiteの場合、ite->firstはkey、ite->secondは値
上記の例のコードは次のとおりです.
作者のブログ交流学習へようこそ:http://blog.csdn.net/IAccepted
Insertメソッド:
mapに1つの要素を挿入する、mapに記録された要素は通常キー値ペアであるため、記憶時にキーと値をpairにカプセル化して挿入する、例えばphone.insert(pair
1つ目は、挿入された要素のキー値がmapにすでに存在すると、挿入に失敗し、要素のキー値対情報は変更されず、キー値がmapで見つからないと、その新しい要素がmapに追加されます.
第2の方法は比較的直感的であるが,性能の問題がある.2を挿入するときは、まずphoneでプライマリ・キーがnameのアイテムを検索しますが、見つかりませんでした.その後、新しいオブジェクトをphoneに挿入します.キーはnameで、値は空の文字列です.挿入が完了すると、文字列をnumberに割り当てます.この方法では、各値をデフォルト値に割り当て、表示された値に割り当てられます.要素がクラス・オブジェクトの場合、オーバーヘッドが大きくなります.キー値がnameの項目が見つかったらnumberで元のnumber値を変更します.
ereaseメソッド:
ereaseは主にmapの項目を削除し、phoneなどのパラメータkeyが必要です.erease(name);key値がnameのキー値ペアを削除することを意味します.
作者のブログ交流学習へようこそ:http://blog.csdn.net/IAccepted
sizeメソッド:
mapのキー値ペアの個数を統計しますphone.size()戻り値はphoneにおけるキー値ペアの個数であり、mapが空であれば0を返す
countメソッド:
mapのキー値の出現回数を統計する、mapのキー値が一意であるため、この方法は、削除時にphoneできるように、キー値が存在するか否かを検出するために使用することができる.count(name)は,0であればユーザにこのキー値が存在しないことを促すことができ,1であれば直接削除する.Ps:ereaseは、削除するキー値ペアが存在するかどうかにかかわらず正常に実行されます.
begin、endメソッド:
beginメソッドはmap反復器タイプを返し,endメソッドの戻り値と比較することでmapを容易に遍歴できる.
clearメソッド:
mapのすべての要素をクリア
作者のブログ交流学習へようこそ:http://blog.csdn.net/IAccepted
Emptyメソッド:
mapが空かどうかを判断し、空であれば真を返し、空でなければ偽を返す.
Ps:mapにはキー値ペアが格納されているため、反復器がiteの場合、ite->firstはkey、ite->secondは値
上記の例のコードは次のとおりです.
#include <iostream>
#include <map>
#include <cstring>
#include <stdlib.h>
#include <fstream>
using namespace std;
class PhoneBook
{
public:
PhoneBook() {}
~PhoneBook() {}
int printall();
int input(string name,string number);
string look(string name);
void exitt();
int readfile(const string filename);
int writefile(const string filename);
int cnt();
private:
map<string,string> phone;
};
int PhoneBook::printall()
{
map<string,string>::iterator ite = phone.begin();
while(ite!=phone.end()) {
cout<<ite->first<<"\t";
cout<<ite->second<<endl;
ite++;
}
return 0;
}
string PhoneBook::look(string name){
map<string,string>::iterator ite = phone.find(name);
if(ite == phone.end()){
return "No this user";
}else{
return ite->first+"\t\t"+ite->second;
}
}
void PhoneBook::exitt()
{
exit(0);
}
int PhoneBook::readfile(const string filename)
{
string a,b,c;
fstream fd;
fd.open(filename.c_str(),ios::in|ios::binary);
if(!fd) {
cout<<"error:write file!"<<endl;
exit(1);
}
phone.clear();
while(fd>>a>>b>>c){
phone.insert(pair<string,string>(a,b));
}
fd.close();
return 0;
}
// :http://blog.csdn.net/IAccepted
int PhoneBook::writefile(const string filename)
{
fstream fd(filename.c_str(),ios::out|ios::binary);
map<string,string>::iterator ite = phone.begin();
while(ite!=phone.end()){
fd<<ite->first<<" "<<ite->second<<" | ";
ite++;
}
fd.close();
return 0;
}
int PhoneBook::input(string name,string number)
{
//phone[name]=number;
phone.insert(pair<string,string>(name,number));
return 0;
}
int PhoneBook::cnt(){
return phone.size();
}
int main()
{
PhoneBook *book = new PhoneBook();
char command[40];
while(true){
cin>>command;
if(strcmp(command,"insert")==0){
string name,number;
cin>>name>>number;
book->input(name,number);
}else if(strcmp(command,"print")==0){
book->printall();
}else if(strcmp(command,"search")==0){
string name;
cin>>name;
cout<<book->look(name)<<endl;
}else if(strcmp(command,"load")==0){
book->readfile("d:\\12.txt");
}else if(strcmp(command,"upload")==0){
book->writefile("d:\\12.txt");
}else if(strcmp(command,"exit")==0){
book->exitt();
}else if(strcmp(command,"count")==0){
cout<<book->cnt()<<endl;
}else{
cout<<"Command Error!
";
continue;
}
}
return 0;
}
// :http://blog.csdn.net/IAccepted
作者のブログ交流学習へようこそ:http://blog.csdn.net/IAccepted