CPP 从入门到入坟01(关于getline、map、for_each)

概述

DC 连结

上次的线上讨论因为大家的能力不太一样,讲一些东西时有人已经会了,有些人不会。
这样会让整个课堂变得很无趣,所以以后会改个方针

变成 : 开这周的题目 ==> 讲要用的工具(基础题) ==> 会的讨论,不会的讲一下工具用法与题示

大概讲讲下面会讲甚么:
0. 必先预备知识

getline & cin(比较)map
在下篇文章02for_each跟这有关的题目与测值题目的提示留言区:範例code(会在DC设暴雷)

必先预备知识

因为前面的东西网路上已经一大堆,而且太简单这里就不讲

各位可以先看一下

cin cout标头档 与 namespace字串(string) 与 字元(char)
4.基本迴圈(ifforwhile switch)
5.阵列

getline & cin 比较

两者都可以接收使用者输入,但有一个不同:

当我今天宣告一个字串变数如果我要输入hello cpp

使用cin的话

cin>>scout<<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


使用前,程式码需要包含几个东西

标头档
#include<map>
namepsace
using namespace std;

map 顾名思义就是地图 :我们需要一个住址与住址带果们到的房子

也可以把他想成邮寄包裹,会有包裹编号包裹里面的内容物

需要注意几点:

我们是由 住址去找到房子包裹编号去找到包裹里面的内容物

然后我们就可以建立一个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;// 得到 4090cout<< box["948794"]<<endl; //得到 用过的卫生纸cout<< box["222"]<<endl; //未建立编号222 ==>没东西

输出结果:

4090显示卡用过的卫生纸

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

map 重点!!!

用专业的讲法:
variable_name[key] = value ; 

variable_name 就是变数名称(在例子中就是指box)
我们说的包裹编号就是: key
value当然就是内容物拉

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;
一些小细节
须注意在建立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'] = 1s[2] = 'l' ==>  eee[s[2]]++ 也就是 eee['l'] = 1s[3] = 'l' ==>  eee[s[3]]++ 也就是 eee['l'] = 2s[4] = 'o' ==>  eee[s[4]]++ 也就是 eee['o'] = 1s[5] = ' ' ==>  为空格 ==> 不存入s[6] = 'c' ==>  eee[s[4]]++ 也就是 eee['c'] = 1s[7] = 'p' ==>  eee[s[7]]++ 也就是 eee['p'] = 1s[8] = 'p' ==>  eee[s[8]]++ 也就是 eee['p'] = 2

经过程式可以得到:

//会自动排keyeee['c'] = 1;eee['e'] = 1;eee['h'] = 1;eee['l'] = 2;eee['o'] = 1;eee['p'] = 2;

因为文章有长度限制,咱们在下篇继续


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章