作者yoco315 (眠月)
看板C_and_CPP
標題Re: [問題] 程式中的空白處會影響程式本身嗎?
時間Mon Apr 11 00:34:00 2011
※ 引述《loveme00835 (朴髮箍)》之銘言:
> 當然引數超過一頁斷行也是必須.
> 加長的手法像是加上識別字:
> std::copy( vec.begin(), vec.end(), std::ostream_iterator<int>(cout) );
> 雖然這樣不超過一頁, 但我還是習慣將第三個引數寫在下一行.
> 另外, 縮短也是有好處的:
> #define each(container) (container).begin(), (container).end()
> std::copy( each(vec), std::ostream_iterator<int>(cout) );
感謝分享,只好來火力支援一下,boost::range 可以直接寫。
boost::copy ( vec, std::ostreamiterator<int>(cout) ) ;
第一個參數並不是 container,而是 range,
因為 container 可以自動轉成一個 range,
所以可以直接把 contaner 傳進演算法。
什麼是 range 請看這邊
http://tinyurl.com/43tl4ar,
懶的看的話其實基本上就是設計來取代 iterator 的東西,
實質上是 pair of iterators,把一對 iterator 包裝起來,
更重要的是把跟 iterator 相關的操作也包裝起來,
於是很多東西用 range 作會非常簡潔易讀(相較於 iterator 而言)。
以 boost::range 裡面提供的範例,
如果我今天不只想要拷貝這個 vec,而且我想要反序拷貝,我只需要寫
boost::copy ( vec | boost::adaptors::reversed,
std::ostream_iterator<int>(std::cout) ) ;
如果我不但想要反序拷貝,而且我只想拷貝 unique 的元素,可以寫
boost::copy( vec | boost::adaptors::reversed
| boost::adaptors::uniqued,
std::ostream_iterator<int>(std::cout) );
不僅易讀,且因為只是 adaptor,不需作出實體,
所以記憶體使用跟校能也都很好。
請大家多多愛用。
--
To iterate is human, to recurse, divine.
遞迴只應天上有, 凡人該當用迴圈. L. Peter Deutsch
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.160.118.86
推 loveme00835:感謝! 好奇有沒有把array包裝起來的方法 04/11 00:51
推 loveme00835:找到了! 原來是漏看 :P 04/11 01:13
→ loveme00835:之前還自己寫... 04/11 01:24
推 tomap41017:太誇張了=口= 04/11 01:58
推 legnaleurc:boost 真是什麼都有 XD 04/11 02:04
推 xatier:推 boost 真的是一座寶山 04/11 07:42
推 adxis:很多寶 不過有沒有啥方法可以簡單抽出來用啊 04/11 11:44
→ adxis:每次都被抱怨用了太肥的lib 0rz 04/11 11:44
→ james732:boost有些header檔應該可以直接拿來用? 04/11 11:48
推 holymars:不是有些..boost大概有八成的library都是header only吧 04/11 14:14
→ yoco315:對了,文中連結強力推薦看一下,是 Andrei Alexandrescu 在 04/11 16:19
→ yoco315:2009 boostcon 演講的內容,裡面對 range 有很清楚的介紹 04/11 16:19
→ yoco315:文中講到很多現有iterator的缺點,以及為什麼需要range 04/11 16:22
→ yoco315:看完會很期待range趕快加入標準 (LOL) 04/11 16:26
推 littleshan:可是C++0x不是已經final draft了嗎 (挖鼻 04/11 17:41
→ yoco315:再等 15 年 XD 04/11 17:58
→ loveme00835:再看看 range-based for 吧, 沒有語言的基本支援, 光 04/11 22:51
推 loveme00835:靠庫還是不夠, 像此例要靠重載運算子, 雖然操作像是 04/11 22:53
→ loveme00835:旗標, 但是仔細看運算元, 語義根本不一樣, 就如 h 大 04/11 22:54
→ loveme00835:所說, 我在用 doc 上的範例時不只需要 header, VS還跟 04/11 22:55
→ loveme00835:我講需要連結 RegEx ...真是不解 04/11 22:55