作者ypf791 (路人1号)
看板EE_DSnP
标题[心得] Traverse over CmdMap
时间Sat Oct 27 02:33:13 2012
typedef map<const string, CmdExec*> CmdMap; (Line 111 @ cmdParser.h)
只是在说CmdMap是某个map换名字
以下正文
(这篇应该不会很长)
----------------------------------------------------
只想提一下如果想拜访每个map里的元素要怎麽做
以前用vector(或阵列)的时候
我们常常写
vector<int> array;
for(size_t i=0; i<array.size(); ++i) {
//somehow(array[i]);
}
之类的东西嘛
可是map的元素根本没有流水号索引
虽然有operator[] 可是意义跟我们所熟悉的差很多
显然不能用来traverse
----------------------------------------------------
C++提供的STL Container 没记错的话全都有一个叫做iterator的内部类别
这个iterator可以取代稍早我写的size_t i的功能
所以我们这样写
map<int,string> mp1;
for(map<int,string>::iterator it=mp1.begin(); it!=mp1.end(); ++it){
//somehow(*it);
}
然後这里有几个note
1. begin和end都是map提供的函数 看名字就知道在干嘛 详情请洽你找到的Tutorial
2. it实作了pre- and post-increase(++), dereference(*)
3. dereference的传回值是pair 里面放的东西与map对应
以上面的例子来讲 Class(*it) == pair<const int, string>;
4. 欲取得pair内的东西 可以直接存取first和second这两个成员变数
-------------------------------------------------
Last but not least,
如果宣告的map是const 如
const map<int,string> mp2;
那我们不能取得他的iterator 因为我们可能会透过iterator修改map的内容
(所以 修改 *it 是会动到 mp1 的内容的喔)
但是我们还是应该要可以traverse这个map
所以办法是
for(map<int,string>::
const_iterator it=mp2.begin(); it!=mp2.end(); ++it){
//somehow_const(*it);
}
-------------------------------------------------
後记:
我觉得我看的那份Tutorial
http://www.cplusplus.com/reference
iterator那边讲得不太清楚
所以才特别来写这篇
如果老师觉得我透露太多的话就d掉吧...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.248.9.249
1F:推 ric2k1:不会呀! 一些观念我们接下来也会教到! 10/27 02:40
2F:推 TommyKSHS:我记得 HW3 有个 function 里面就是要用 const_iterator 10/27 11:24
3F:→ TommyKSHS:以前写的时候被 compiler 吐嘈这个很久 XD 10/27 11:25
4F:推 XDucka:我看的tutorial根本没有解释const_iterator Orz 10/27 14:59
5F:推 steve1012:哇哩 要注意const_iterator 和const iterator不一样喔 10/27 16:14
6F:→ steve1012:const_iterator应该是像const method 一样所以才能存取 10/27 16:15
7F:→ steve1012:const object 10/27 16:15
8F:推 boiq:楼上那个我昨天查抄久才看到解法哇咧!! 10/27 16:54
9F:→ boiq:而且Compile还喷四五行看不太懂的东西,可怕! 10/27 16:55
10F:推 XDucka:所以不只是 const map<key,value>要用const_iterator 10/27 23:44
11F:→ XDucka:连 map<const key , value> 这样也要用const_iterator? 10/27 23:45
12F:→ djshen:const key的意义是..? 10/28 00:18
13F:推 ric2k1:楼上,不用哦! 只有 const map 才要 const_iterator 10/28 00:19
14F:推 steve1012:key好像已经是const了 10/28 00:46
15F:→ ypf791:但const func似乎会默认所有data member为const...咕嘿嘿(? 10/28 00:46
16F:推 taldehyde:天哪 岂不是要拜一下m(_ _)m 这篇瞬间解决我的问题 10/28 17:19
17F:推 XDucka:原来是const function把map const了.... 10/28 19:28
18F:推 jasonshan:const解说非常实用 感谢 10/31 17:29