iT邦幫忙

0

CPP 從入門到入墳01(關於getline、map、for_each)

  • 分享至 

  • xImage
  •  

概述

DC 連結

上次的線上討論因為大家的能力不太一樣,講一些東西時有人已經會了,有些人不會。
這樣會讓整個課堂變得很無趣,所以以後會改個方針

變成 : 開這周的題目 ==> 講要用的工具(基礎題) ==> 會的討論,不會的講一下工具用法與題示

大概講講下面會講甚麼:
0. 必先預備知識

  1. getline & cin(比較)
  2. map
    在下篇文章02
  3. for_each
  4. 跟這有關的題目與測值
  5. 題目的提示
  6. 留言區:範例code(會在DC設暴雷)

必先預備知識

因為前面的東西網路上已經一大堆,而且太簡單這裡就不講

各位可以先看一下

  1. cin cout
  2. 標頭檔 與 namespace
  3. 字串(string) 與 字元(char)
    4.基本迴圈(ifforwhile switch)
    5.陣列

getline & cin 比較

兩者都可以接收使用者輸入,但有一個不同:

當我今天宣告一個字串變數如果我要輸入hello cpp

使用cin的話

cin>>s
cout<<s;

的到的結果

hello

會發現他只有把hello給存取而cpp則不會存入s

因為cin會因為讀到空格而結束,所以讀到hello時遇到空格,讀取結束,s存入hello

如果我們要讀整行怎麼辦呢?

這個時候,就要使用getline:

getlinecin不同,cin是遇到空格結束,而getline是遇到'\n'(換行)才結束讀取

使用方法:

// getline (取得字串方式(輸入:cin) , 要存到的變數裡(s))
getline(cin,s);

cout<<s;

這樣我們就得到了:

hello cpp
  • 總結:

當我們想要存取一行字在同一個變數裡時,就使用getline吧!

map

個裡給一個情境:

當今天選舉時,我想知道這個候選人被投了幾票時,怎麼使用C++來計算呢?

有學過一點的可能會說可以用二階陣列,但如果我想要依照ASCII來排序候選人的名字時,用二階陣列就會有相形見絀的地方了

所以我們來介紹一個工具map


使用前,程式碼需要包含幾個東西

  1. 標頭檔
#include<map>
  1. namepsace
using namespace std;

map 顧名思義就是地圖 :我們需要一個住址住址帶果們到的房子

也可以把他想成郵寄包裹,會有包裹編號包裹裡面的內容物

需要注意幾點:

  1. 我們是由 住址去找到房子
  2. 包裹編號去找到包裹裡面的內容物

然後我們就可以建立一個map!

map<string,string> box

講解一下再< >裡的東西
包裹編號內容物來舉例的話:

< 包裹編號的類型(可以是int、string、char...) , 內容物的類型(可以是int、string、char...) > 變數名稱

< >包起來,而變數名稱你可以想像他是物流公司(裡面有很多的包裹,每個包裹都有編號內容物)

ok,現在我們已經建立一個map了,接下來就是在裡面建立包裹了!

// 變數名稱[編號] = 內容物
box["10001"] = "4090顯示卡";
box["940894"] = "用過的衛生紙";

如上所示:

我們建立了兩個包裹,編號分別為10001948794
而在10001中我們會找到4090顯示卡
948794會找到用過的衛生紙

可以試試看:

cout<< box["10001"]<<endl;// 得到 4090
cout<< box["948794"]<<endl; //得到 用過的衛生紙
cout<< box["222"]<<endl; //未建立編號222 ==>沒東西

輸出結果:

4090顯示卡
用過的衛生紙

當然如你有需要,可以在製作更多的【包裹】XD

map 重點!!!

  1. 用專業的講法:
variable_name[key] = value ; 

variable_name 就是變數名稱(在例子中就是指box)
我們說的包裹編號就是: key
value當然就是內容物拉

  1. map 其實會自動排列
    map 會排列key(注意:不會排value,value會跟著key一起排)
    按照 ASCII code(第一個字)
    如果我們建立
map <string,int> the_bone;
the_bone["zzz"] = 5;
the_bone["azzzzzzzzzzz"] = 6;
the_bone["c"] = 9;

進入map後會被自動排序變成:(a<c<z)

the_bone["azzzzzzzzzzz"] = 6;
the_bone["c"] = 9;
the_bone["zzz"] = 5;
  1. 一些小細節
    須注意在建立map後包裹的型態必須跟建立的型態相同
map<string,string> box //編號:字串 || 內容物:字串
box[1234] = "吉娃娃";//錯誤==>編號:整數 || 內容物:字串
box["23232"] = 大寶劍; //編號:字串 || 內容物:變數(未定義)<==錯誤(字串應該用""包起來)
Bbox["666"] = "刮腿毛,撿到男高中生"; // 錯誤==>未定義 Bbox

情境:

如果我今天要讓使用者自己輸入編號或包裹內容呢?

那我們可以這樣:

string s,s1;
cin>>s>>s1;
box[s] = s1;

cout<<box[s]<<endl;

這樣就建立拉!

試試輸入:
1234
九轉大腸

輸出結果

九轉大腸

新鮮的大腸就送到你家摟~XD


當然map最主要的目的是用來計數的

假如說我們想看看一串話(hello cpp)每個子母出現幾次

建立一個map

map<char,int> eee;//編號:字元(英文字母) || 內容物:整數

接下來我們要讀取一串話(會有空格) ==>用getline

string s;
getline(cin,s);

然後用for經過整個s並且存入map

 for (int i = 0; i < s.length(); i++)//從s[0] 到 s[最後一個字]
    {
        if (s[i] != ' ')//如果不是空格就存入
            eee[s[i]]++;
    }

人體操做一次:

s[0] = 'h' ==>  eee[s[0]]++ 也就是 eee['h'] = 1 
s[1] = 'e' ==>  eee[s[1]]++ 也就是 eee['e'] = 1
s[2] = 'l' ==>  eee[s[2]]++ 也就是 eee['l'] = 1
s[3] = 'l' ==>  eee[s[3]]++ 也就是 eee['l'] = 2
s[4] = 'o' ==>  eee[s[4]]++ 也就是 eee['o'] = 1
s[5] = ' ' ==>  為空格 ==> 不存入
s[6] = 'c' ==>  eee[s[4]]++ 也就是 eee['c'] = 1
s[7] = 'p' ==>  eee[s[7]]++ 也就是 eee['p'] = 1
s[8] = 'p' ==>  eee[s[8]]++ 也就是 eee['p'] = 2

經過程式可以得到:

//會自動排key
eee['c'] = 1;
eee['e'] = 1;
eee['h'] = 1;
eee['l'] = 2;
eee['o'] = 1;
eee['p'] = 2;

因為文章有長度限制,咱們在下篇繼續


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言