1. 程式人生 > >Boolan STL與泛型編程第三周筆記

Boolan STL與泛型編程第三周筆記

line 不用 無法 word use log push_back 刪除 從後往前

對於本周老師講的內容,C++ Primer上面有第十一章關聯容器的習題可以做。有一些地方還是不懂,搞明白了再寫上來。

P422 E11.4
//P422 E11.4
#include<string>
#include<map>
#include<iostream>
using namespace std;

//要在一個容器中刪除元素,好的辦法是從後往前遍歷,被刪除元素後面的元素會移動到被刪除的位置,
//這樣不用像18行那樣移動叠代器
string &process(string &s)
{
    //原來我把i的類型寫成int, 有warning 有符號/無符號類型不匹配
for (string::size_type i = 0; i < s.size(); i++) { if (s[i] >= A && s[i] <= Z) s[i] -= (A - a); else if (s[i] == , || s[i] == .) { //這一步本身已經實現了題目的要求,但是要處理",Mac"成為"mac",須在此步後加i-- //erase()使i到達M,i++跳過M,就無法處理了 s.erase(i, 1
); i--; } } return s; /* //原來我寫的代碼 if (s.at(0) >= ‘A‘ && s.at(0) <= ‘Z‘) { s.at(0) += ‘A‘ - ‘a‘;//這裏寫錯了,應該是-= } if (s.find(‘,‘)) { s.erase(‘,‘); } if (s.find(‘.‘)) { s.erase(‘.‘); } */ } int
main() { string word; map<string, size_t> word_count; while (cin >> word) { process(word); ++word_count[word]; } for (const auto &s : word_count) { cout << s.first << " " << s.second << endl; } system("pause"); return 0; }

P424 E11.7

//P424 E11.7
#include<map>
#include <vector>
#include <string>
#include <iostream>
using namespace std;

void add_family(map<string, vector<string>> &families, const string &family)
{
    families[family];
}

void add_child(map<string, vector<string>> &families, const string &family, const string &child)
{
    families[family].push_back(child);
}
void print(map<string, vector<string>> &_families)
{
    
    for (const auto f : _families)
    {
        cout << f.first << ": " << endl;
        for (const auto &f : f.second)            
        {
            cout << f << " "; 
        }
        cout << endl;
        
    }
    
}
int main()
{
    map<string, vector<string>> families;
    /*
    add_family(families, "Joyce");
    add_child(families, "Joyce", "James");
    add_child(families, "Joyce", "Jack");
    add_child(families, "Austen", "Browning");
    add_child(families, "Austen", "Jane");
    */
    
    while (cin)
    {
        cout << "請輸入姓:" << endl;
        string family_name;
        cin >> family_name;

        add_family(families, family_name);
        cout << "請輸入名:" << endl;
        string first_name;
        

        cin >> first_name;
    }

    print(families);
    cout << endl;

    system("pause");
    return 0;
}

P426 E11.9

//P426 E11.9
#include<list>
#include<map>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
//第二遍做對了,看了答案有了想法
int main()
{
    map<string, list<int>> word_lineno;
    string word;
    int line = 0;
    while (cin >> word)
    {
        word_lineno[word].push_back(line++);
    }

    for (const auto &w : word_lineno)
    {
        cout << w.first << ":" << endl;
        for (const auto &i : w.second)
        {
            cout << i << " ";
        }
        cout << endl;
    }

    system("pause");
    return 0;
}

P428 E11.12

//P428 E11.12
#include <utility>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
//學習新的輸入方式
int main()
{
    string s;
    int i;
    vector<pair<string, int>> vec;
    while (cin >> s && cin >> i)//新的輸入方式
        //E11.13 vec.push_back({s,v});
        //vec.push_back(pair<string, int>(s,v));
        vec.push_back(make_pair(s, i));

    for (const auto &v : vec)
    {
        cout << v.first << " " << v.second << endl;
    }

    system("pause");
    return 0;
}

P428 E11.14

//P428 E11.14
#include<map>
#include <utility>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
//看註釋復習
void add_family(map<string, vector<pair<string, string>>> &families, const string &family)
{
    families[family];
}

void add_child
(map<string, vector<pair<string, string>>> &families, const string &family, const string &child, const string &birth)
{
    families[family].push_back((child, birth));//註意pair的構造方式{},(),make_pair()
}
void print(map<string, vector<pair<string, string>>> &_families)
{
    for (const auto f : _families)
    {
        //我原來一直不知道map裏的key怎麽輸出:map裏面是一個pair,pair是一個pair
        cout << f.first << ": " << endl;
        for (const auto &c : f.second)
        {
            cout << c.first << "-" << c.second << " ";
        }
        cout << endl;
    }

}
int main()
{
    map<string, vector<pair<string,string>>> families;
    add_family(families, "Joyce");
    add_child(families, "Joyce", "James", "1890-1-1");
    add_child(families, "Joyce", "Jack", "2980-2-3");
    add_child(families, "Austen", "Browning", "1234-2-3");
    add_child(families, "Austen", "Jane", "1212-3-4");
    print(families);
    cout << endl;

    system("pause");
    return 0;
}

P434 E11.20

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

int main()
{
    string word;
    map<string, int> word_count;
    while (cin >> word)
    {
    //用下標簡單些
    //++word_count[word];

    //E11.21這個語句的作用跟我的程序一樣
    //++word_count.insert({ word, 0 }).first->second;

    /* 用insert復雜一些
        auto ret = word_count.insert({word, 1 });
        if (!ret.second)
            ++ret.first->second;
    */

    }
    for (const auto &w : word_count)//A map is a COLLECTION of pairs.
    {
        cout << w.first << " " << w.second << endl;
    }

    system("pause");
    return 0;
}

Boolan STL與泛型編程第三周筆記