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は値
上記の例のコードは次のとおりです.
#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