chapter-11

// chapter-11.cpp : 定義控制臺應用程序的入口點牢裳。
//

#include "stdafx.h"
#include<iostream>
#include<string>
#include<map>
#include<set>
#include<utility>           //定義了pair類型!
#include<vector>
#include<fstream>
#include<deque>

using namespace std;

class Info_Stu
{
public:
    Info_Stu() = default;
    Info_Stu(const string &a,const double b):id(a),grades(b){}
    string get_id()const { return id; }
    double get_grade()const { return grades; }

private:
    string id;
    double grades;
};

bool compare_info_stu(const Info_Stu &lh, const Info_Stu &rh)
{
    return lh.get_id() < rh.get_id();
}

map<string, string> bulid_map_format(ifstream &in_format)
{
    string tmp;
    map<string, string> ret;
    while (getline(in_format,tmp))
    {
        auto pos = tmp.find('=');
        if (pos!=string::npos)
        {
            string key_ret = tmp.substr(0, pos);
            ret[key_ret] = tmp.substr(pos+1, tmp.size() -pos-1);
        }
    }
    return ret;
}

int main()
{
    //按關鍵字有序保存元素
    //map                   關鍵字--值
    //set                   關鍵字息尺,只保存關鍵字
    //multimap              關鍵字可重復
    //multiset              關鍵字可重復
    //無序集合
    //unordered_map         關鍵字無序儲存讨永,使用哈希函數(shù)儲存元素
    //unordered_set         關鍵字無序儲存酪耳,使用哈希函數(shù)儲存元素
    //unordered_multimap    無序劣光、可重復
    //unordered_multiset    無序国觉、可重復

    //使用map做單詞計數(shù)程序!
    map<string, size_t> word_count;         //數(shù)組下標通常定義為size_t
    string word;
    unsigned total=2;
    while (total>0)
    {
        if (cin >> word)
        {
            ++word_count[word];             //map下標運算符返回為左值嫡良,可以進行讀寫操作!
            --total;
        }
    }
    for (const auto &r : word_count)            //得到pair類型的對象献酗!
    {
        cout << r.first << ":" << r.second <<" "<<((r.second>1)?"times":"time")<< endl;
    }
    cout << endl;

    //添加set過濾統(tǒng)計字符串
    set<string> exclude = { "the","and","but" };
    for (const auto &r : word_count)            //得到pair類型的對象寝受!
    {
        if(exclude.cend()==exclude.find(r.first))
            cout << r.first << ":" << r.second << " " << ((r.second>1) ? "times" : "time") << endl;
    }

    //關聯(lián)容器支持順序容器基本操作(初始化、互換等等)罕偎,但是不支持push_back等很澄,因為關聯(lián)容器是根據(jù)關鍵字儲存的!
    //有序關聯(lián)容器的關鍵字元素類型必須定義元素的比較方法颜及,默認情況下使用<運算符來比較關鍵字甩苛!對于shared_ptr,則還需要定義刪除器俏站!
    set<Info_Stu, decltype(compare_info_stu)*> student_2017(compare_info_stu);

    //pair,可以通過first和second來訪問成員讯蒲!
    pair<string, size_t> word_the{ "the",3 };
    cout << word_the.first << ":" << word_the.second <<" "<<"times"<< endl;
    //pair<T1,T2> p(v1,v2)  /   pair<T1,T2> p={v1,v2}   /pair<T1,T2> p; 初始化形式!
    //make_pair(v1,v2)          返回一個pair
    //p.first和p.second          返回對應的成員
    //p1 < p2                   pair可以進行關系比較乾翔,其實質(zhì)為first和second進行比較!
    //p1==p2                    pair可以進行XX比較施戴,其是指為利用元素的==運算符實現(xiàn)反浓!

    //關聯(lián)容器操作
    //key_type                  此容器類型的關鍵字類型
    //mapped_type               每個關鍵字關聯(lián)的類型:只適用于map
    //value_type                對于set,與key_type相同赞哗;對于map雷则,為pair<const key_value,mapped_type>
    map<string, unsigned>::mapped_type val_1;
    //關聯(lián)容器的迭代器,當解引用迭代器時肪笋,會得到value_type的值引用月劈!
    //set的迭代器是const的度迂,只能讀取關鍵字,但是不能修改猜揪!map的關鍵字也不能修改惭墓!關聯(lián)容器的關鍵字都不能修改!
    //通常不要對關聯(lián)容器使用泛型算法而姐,因為set和map的關鍵字均為const腊凶!
    //插入元素,set
    vector<int> ivec_insert_set = { 1,2,3,4,4,3,2,1 };
    set<int> iset_inserted;
    iset_inserted.insert(ivec_insert_set.cbegin(),ivec_insert_set.cend());
    iset_inserted.insert({ 1,2,3,4,5 });
    auto beg = iset_inserted.cbegin();
    for (; beg != iset_inserted.cend(); ++beg)
    {
        cout << *beg << " ";
    }
    cout << endl;
    //插入元素,map
    map<string, size_t> imap_inserted;
    imap_inserted.insert({ "and",6 });          //插入的元素必須為pair
    //c.insert(v)/c.emplace(args)/c.insert(b,e)/c.insert(il)/c.insert(p,v)/c.emplace(p.args)
    //insert的返回類型依賴于容器類型和參數(shù),對于不包含重復關鍵字的容器拴念,返回pair钧萍。first為迭代器,指向給定關鍵字的元素(map的元素為pair)政鼠;second為布爾值风瘦,指出元素是否插入成功!(若給multiset和multimap插入元素公般,則只返回一個指向新元素的迭代器万搔,因為插入肯定是成功的!)
    auto ret = imap_inserted.insert(make_pair("but", 9));
    cout << (ret.first->first) <<":"<< ret.second << endl;
    //刪除元素
    //c.erase(k)            刪除關鍵字為k的元素,返回刪除元素的個數(shù)(size_t)
    //c.erase(p)            刪除迭代器p指向的元素俐载,返回p之后元素的迭代器
    //c.erase(b,e)          刪除b到e中所有元素蟹略,返回e。
     //map的下標操作遏佣,只適用于非const的map和unordered_map挖炬!容器含有下標運算符和at函數(shù)!set不支持下標操作状婶!
    cout << imap_inserted.at("and") << endl;        //當使用下標運算符[]意敛,若關鍵字k不存在,則添加關鍵字為k的元素膛虫!使用at函數(shù)草姻,若關鍵字k不存在(帶參數(shù)檢查),則k不存在拋出異常稍刀!
    //訪問元素
    //c.find(k)             返回指向關鍵字為k的元素迭代器撩独,若k不在容器中,返回尾后迭代器
    //c.count(k)            統(tǒng)計關鍵字為k的元素的數(shù)量
    //c.lower_bound(k)      返回一個迭代器账月,指向第一個關鍵字不小于k的元素综膀。lower_bound和upper_bound不適用于無序容器!
    //c.upper_bound(k)      返回一個迭代器局齿,指向第一個關鍵字大于k的元素剧劝。若lower_bound和upper_bound返回相同的迭代器,則給定關鍵字不存在抓歼!
    //c.equal_range(k)      返回一個迭代器pair讥此,指向關鍵字等于k的元素的范圍拢锹!
    for (auto pos = imap_inserted.equal_range("but"); pos.first != pos.second; ++pos.first)
    {
        cout << pos.first->first << ":" << pos.first->second << " " << "times";
    }
    cout << endl;


    ifstream in_format("C:/Users/winack/Documents/Visual Studio 2017/Projects/chapter-11/format.txt");
    map<string, string> format_string;
    if (in_format)
    {
        format_string = bulid_map_format(in_format);
    }
    in_format.close();

    //map<string, string> format_string = { {"k","okay"},{"y","you"},{"r","are"} };
    deque<string> in_string;
    ifstream in_file("C:/Users/winack/Documents/Visual Studio 2017/Projects/chapter-11/1.txt");
    if(in_file)
    {
        
        string tmp;
        while (in_file>>tmp)
        {
            auto find_tmp = format_string.find(tmp);
            if (find_tmp != format_string.cend())
            {
                tmp = find_tmp->second;
            }
            in_string.push_back(tmp);
        }
    }
    in_file.close();
    for (auto &r : in_string)
    {
        cout << r << " ";
    }
    ofstream out_file("C:/Users/winack/Documents/Visual Studio 2017/Projects/chapter-11/2.txt");
    if (out_file)
    {
        for (auto &r : in_string)
        {
            out_file << r << " ";
        }
    }
    out_file.close();

    //無序容器,使用哈希函數(shù)和關鍵字類型==運算符萄喳,在關鍵字沒有明顯的序關系時維護元素的序列代價非常高昂時卒稳,無序容器很有用!
    //取胎?展哭??闻蛀?匪傍??觉痛?役衡?

    system("pause");
    return 0;
}

//關聯(lián)容器的元素是按關鍵字來保存和訪問的;順序容器是按在容器中的位置順序來保存和訪問的薪棒!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末手蝎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子俐芯,更是在濱河造成了極大的恐慌棵介,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吧史,死亡現(xiàn)場離奇詭異邮辽,居然都是意外死亡,警方通過查閱死者的電腦和手機贸营,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門吨述,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钞脂,你說我怎么就攤上這事揣云。” “怎么了冰啃?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵邓夕,是天一觀的道長。 經(jīng)常有香客問我阎毅,道長焚刚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任净薛,我火速辦了婚禮汪榔,結(jié)果婚禮上蒲拉,老公的妹妹穿的比我還像新娘肃拜。我一直安慰自己痴腌,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布燃领。 她就那樣靜靜地躺著士聪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猛蔽。 梳的紋絲不亂的頭發(fā)上剥悟,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音曼库,去河邊找鬼区岗。 笑死,一個胖子當著我的面吹牛毁枯,可吹牛的內(nèi)容都是我干的慈缔。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼种玛,長吁一口氣:“原來是場噩夢啊……” “哼藐鹤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赂韵,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤娱节,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后祭示,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肄满,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年绍移,在試婚紗的時候發(fā)現(xiàn)自己被綠了悄窃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹂窖,死狀恐怖轧抗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瞬测,我是刑警寧澤横媚,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站月趟,受9級特大地震影響灯蝴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜孝宗,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一穷躁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧因妇,春花似錦问潭、人聲如沸猿诸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梳虽。三九已至,卻和暖如春灾茁,著一層夾襖步出監(jiān)牢的瞬間窜觉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工北专, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留禀挫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓拓颓,卻偏偏與公主長得像特咆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子录粱,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容