[]使用にピットオペレータにC ++ STLマップ

序文

マップがあることを学習C ++、マップの発見、将来の構造は、それらが深く、キーと値のペアのこのように魅了され、書き込みコードはまた、このような構造から徐々に不可分である、チャンス発見[]操作は文字は、私の目の前で待っている深いピットを知らない、書き込みコードをより便利に、のような、新しい世界を発見したように見えます。

問題

そのようなマップを定義するものとして、マップや遵法、挿入・削除機能を使用することを学ぶために開始時間は、最初のヘッダファイルと名前空間を導入しました:

#include <map>
using namespace std;

map<int, int> mapTest;

その上にマップオブジェクトの構造を定義することは容易である使用は、それが何であるかをマッピングし、別のマップへの整数の整数でありますか?ここでは簡単な例で、このマッピングは、あまりにも長い間、我々は学生番号を知っているように、あなたが直接マップから簡単に対応するスコアを得ることができ、学生数と学校の成績との間の対応として使用することができます。

最も一般的に次の二つの方法を挿入したときに学習を開始:

mapTest.insert(map<int, int>::value_type(1001, 100));
mapTest.insert(make_pair(1002, 98));

しかし、学んmap[]、その後のオペレータ、上記のコードを書くことができます。

mapTest[1001] = 100;
mapTest[1002] = 98;

要素時間使用する必要の検索find()機能は一般的に書かれているが

map<int, int>::const_iterator itor = mapTest.find(1001);
if (itor != mapTest.end())
    return itor->second;

しかし、学んmap[]、その後のオペレータ、コードは次のように省略することができます言いました:

return mapTest[1001];

そのような計数のためのような要素を挿入するとき、特に、キーに対応する値に1を加えるたびに、直接書き込むことができます。

mapTest[1001] += 1;

チェックする必要はありません1001、このキーが存在して使用[]する最初の0にデフォルトを使用する前に、オペレータが、その後、実行+1操作を、使用する前にこの比率find()検索をして、+1より便利に挿入する前の動作が。

実際には、これが唯一の使用でmap、砂糖の文法構造が、砂糖のIのマウスピースが穴に落ちたので、アップ渡すために、シンタックスシュガーを作るのは素晴らしい甘すぎるだろうのでコールmapすることができ、時には副作用の原因キーを見つけることではない場合mapに意志をmapキーの対応する場所にデフォルト値の挿入、例で見てみましょうを理解します。

テストプロセス

コンパイラが適切な環境で見ることができない場合は、VS2015、C ++ 11標準で動作するようにコンパイル、テストコードが異なっている、また、上記の例のテストを実装するためのコードを変更しようと、利用map店舗生徒の数とスコアへ対応関係、関係を記述するためのクラスの次の単純な実装:

書き込みテストクラス

#include <map>
#include <iostream>
#include <algorithm>
using namespace std;

class CReportCard
{
public:
    CReportCard() { m_mapStuNo2Score.clear(); }
    ~CReportCard() { m_mapStuNo2Score.clear(); }
public:
    void LoadScores(); // 模拟录入成绩
    int  GetScoreByStudentNo(const int nStudentNo); // 根据学号查询成绩
    void PrintReportCard(); // 打印成绩单
private:
    map<int, int> m_mapStuNo2Score;
};

void CReportCard::LoadScores()
{
    m_mapStuNo2Score[1001] = 99;
    m_mapStuNo2Score[1002] = 94;
    m_mapStuNo2Score[1004] = 89;
    m_mapStuNo2Score[1005] = 92;
    m_mapStuNo2Score[1007] = 80;
}

int CReportCard::GetScoreByStudentNo(const int nStudentNo)
{
    return m_mapStuNo2Score[nStudentNo];
}

void CReportCard::PrintReportCard()
{
    cout << "show report card start----->" << endl;
    std::for_each(m_mapStuNo2Score.begin(), m_mapStuNo2Score.end(), [](std::map<int, int>::reference socrepair)
    {
        std::cout << socrepair.first << "'s score = " << socrepair.second << "\n";
    });
    cout << "show report card end<------" << endl;
}

このクラスは非常に単純であり、mapオブジェクトタイプm_mapStuNo2Scoreの生徒の数及び性能格納対応関係をLoadScores()用いて機能[]するようにオペレータにmap要素を挿入し、シミュレーション結果エントリプロセスと、GetScoreByStudentNo()機能も使用[]オペレータシミュレーション結果問合せ手順と、PrintReportCard()機能は横断map印刷カード情報を報告します。

一見、通常の呼び出し

そして、次のようにこのクラス、テストを使用する関数を記述します。

int main(int argc, char* argv[])
{
    CReportCard obj;
    obj.LoadScores();

    cout << "student no = 1001, score = " << obj.GetScoreByStudentNo(1001) << endl;
    cout << "student no = 1004, score = " << obj.GetScoreByStudentNo(1004) << endl;

    obj.PrintReportCard();

    return 0;
}

まず、呼び出しLoadScores()データをロードする機能を、その後、GetScoreByStudentNo()学校の関数としての数を見つけるために100110042つの生徒の学力、あなたのトランスクリプトの最後の印刷を、結果での外観をしてみましょう:

学生無= 1001、スコア= 99
、学生無= 1004、スコア= 89
ショーのレポートカード開始----->
1001のスコア= 99
1002のスコア= 94
1004のスコアは= 89
1005のスコア= 92
1007のスコア= 80
ショーレポートカード終了<------

クエリは、次に何が起こるか存在しない場合のスコアと転写産物のクエリアウトこれらの結果、通常の印刷では、すべてが、学生の数を何の問題も見えていませんか?

問題のコール

上記テスト機能を変更し、学生番号変更値は、次のように変更、存在しません。

int main(int argc, char* argv[])
{
    CReportCard obj;
    obj.LoadScores();

    cout << endl;
    cout << "student no = 1011, score = " << obj.GetScoreByStudentNo(1011) << endl;
    cout << "student no = 1014, score = " << obj.GetScoreByStudentNo(1014) << endl;

    obj.PrintReportCard();

    return 0;
}

コンテンツの大部分が存在しない状況に、唯一の学生の数を変更していない、次のように、テスト結果は以下のとおりです。

学生無= 1011、スコア= 0
の学生なし= 1014、スコア= 0
ショーのレポートカード開始----->
1001のスコア= 99
1002のスコアは= 94
1004のスコア= 89
1005のスコア= 92
1007のスコアは= 80
1011のスコア= 0
1014年のスコア= 0
ショーレポートカード終了<------

学生IDが0の対応するスコアには存在しません、それはまた言わすべきことであるが、過去に、キーが存在しないため、そのmap使用[]事業者は存在しません0整数のデフォルト値に戻すための鍵を見つけるために見たときに、しかし、プリント結果に単一の時間完全に露出実際つ以上の、[]オペレータが生じ得る副作用を。

リターンを探しているときに、[]オペレータは、原因不明に挿入され、デフォルト値が終了されるだろうが、また、ペアとしてのキーとデフォルト値を見つけるために見つけることができません戻り値の種類に対応していないmapので、この操作は、一般的に、我々は必要としません、あなたは明確にこの副作用を必要としないときのために一見mapの要素は使用しません[]演算子を。

状況を改善

上記といえば、[]オペレータはこれを探したり、使用している場合、一般的に私たちが使用していないインサート・副作用に見つけることができないfind()、修正するいくつかのより多くの標準化の機能をGetScoreByStudentNo()、次のような機能を:

int CReportCard::GetScoreByStudentNo(const int nStudentNo)
{
    //return m_mapStuNo2Score[nStudentNo];
    map<int, int>::const_iterator itor = m_mapStuNo2Score.find(nStudentNo);
    return itor != m_mapStuNo2Score.end() ? itor->second : 0;
}

通常の上で実行この場合の例として、転写産物は無効な値に挿入することができません。

概要

  1. map[]存在しないキーは、デフォルト値は、対応するキー位置に挿入されたとき、オペレータは、副作用を有します
  2. 常にあまりにも便利な深い穴を埋め、自分自身を与えることがあり、明確な心を保ちます
  3. 自然への畏敬の念、生命の畏敬の念、あなたが書いたコードのすべての行の恐怖
公開された150元の記事 ウォンの賞賛277 ビュー530 000 +

おすすめ

転載: blog.csdn.net/shihengzhen101/article/details/103529462