青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

沐楓小筑(C++)

愛老婆,要比編程多一點(diǎn)...

  C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  18 Posts :: 0 Stories :: 84 Comments :: 0 Trackbacks

公告

沐楓的個(gè)人主頁(yè)

eoool.com生成

eoool.com生成

常用鏈接

留言簿(8)

我參與的團(tuán)隊(duì)

搜索

  •  

積分與排名

  • 積分 - 57590
  • 排名 - 404

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

    一直在使用C/C++,對(duì)于循環(huán)語句while、do while、for,對(duì)于for情有獨(dú)鐘,因?yàn)槠浜?jiǎn)潔、清晰、靈活。訪問數(shù)組類型的變量,只有for寫出來的語句是最易于閱讀的,如:
int arr[N] = {/**/};
for(int i = 0; i < N; ++i)
  printf(
"arr[%d] = %d\n", i, arr[i]);

    然而,這種情況,到了STL時(shí),就有些變味了:
for(vector<MyClass>::const_iterator iter = m_vecData.begin(); iter != m_vecData.end(); ++iter)
{
    
if(!iter->IsBusy())
        iter
->DoSomeThing(param);
}
    這么長(zhǎng)的一個(gè)for,不再給人一種清晰的感覺了。或許因?yàn)檫@個(gè)程序比較短,還沒有太大的感覺,當(dāng)回頭去看自已的程序中,有不少這樣的寫法時(shí),我就覺得一陣心煩。改改?
for(size_t i = 0; i < m_vecData.size(); ++i)
{
    
if(!m_vecData[i].IsBusy())
        m_vecData[i].DoSomeThing(param);
}
    不錯(cuò),還是簡(jiǎn)單點(diǎn)好啊。但是因?yàn)檫@里舉的是vector的例子。如果是list或是別的什么容器,就行不通了。
    其它的高級(jí)語言,都提供了foreach或是for in語句,寫出來就很清晰:
foreach(item in m_vecData)
{
    
if(!item.IsBusy())
        item.DoSomeThing(param);
}
    C++是不是也可以這么簡(jiǎn)單?好象STL中也有一個(gè)for_each,試著改寫一下:
struct IfNotBusyThenDoSomeThing
{
   
IfNotBusyThenDoSomeThing(const Param& param)
        : param_(param)
    {}
    
void operator() (const MyClass& item)
    {
        
if(!item.IsBusy())
            item.DoSomeThing(param_);
    }
private:
    
const Param& param_;
};

for_each(m_vecData.begin(), m_vecData.end(),
IfNotBusyThenDoSomeThing(param));
    不錯(cuò),for語句簡(jiǎn)單了,但是卻多了IfNotBusyThenDoSomeThing的定義,這代碼可是多了好幾倍。要是每個(gè)循環(huán)都要來這么一下,我還不如直接寫for,要來得爽快一些。或許還有別的辦法:
vector<MyClass> notBusyClass;
remove_copy_if(m_vecData.begin(), m_vecData.end(), inserter(notBusyClass, notBusyClass.begin()), mem_fun_ref(
&MyClass::IsBusy));
for_each(notBusyClass.begin(), notBusyClass.end(), bind2nd(mem_fun_ref(
&MyClass::DoSomeThing), param));
    天哪,這種寫法好象更恐怖。而且,還不是每種情況都能用的:
    1. notBusyClass不能是vector<const MyClass&>,因?yàn)椴荒芙⒅赶蛞玫闹羔槨_@就要求MyClass是可拷貝的。但就算是可拷貝的,有時(shí)候拷貝成本也是很高的。
    2. MyClass::DoSomeThing的參數(shù)不能是引用(我們常定義參數(shù)為:const Param&),因?yàn)椴荒芏x引用的引用這種類型。
    3. 一旦出現(xiàn)錯(cuò)誤,這錯(cuò)誤信息會(huì)讓人極其昏倒。

    看來單靠標(biāo)準(zhǔn)C++是不成的。Boost的lambda的庫(kù)似乎很不錯(cuò),用用:
    for_each(m_vecData.begin(), m_vecData.end(),
        if_then( !bind(
&MyClass::IsBusy, _1),
            bind(
&MyClass::DoSomeThing, _1, param)));
    不錯(cuò),好了一些,但是還是很不好看。有沒有更好的?有,boost1.34新加入的BOOST_FOREACH:
BOOST_FOREACH(cosnt MyClass& item, m_vecData)
{
    
if(!item.IsBusy())
        item.DoSomeThing(param);
}
    Oh Yeah!

    好了,問題來了,為什么C++不直接在語言中提供foreach這個(gè)功能呢?
    個(gè)人認(rèn)為,原因有幾點(diǎn):
    1. C/C++除了數(shù)組外,沒有內(nèi)置的容器,因此for語句足矣。
    2. 當(dāng)C++進(jìn)化到STL的時(shí)候,C++標(biāo)準(zhǔn)委員會(huì)根本沒空去考慮其它的。
    而其它高級(jí)語言之所以內(nèi)置了foreach,就是因?yàn)樗鼈円婚_始就提供了標(biāo)準(zhǔn)的容器庫(kù)和迭代/枚舉接口,因此提供foreach就順理成章了。

    現(xiàn)在,總算C++開始考慮,由模板引入而造成的代碼復(fù)雜性的問題,這的確是Cpper的福音。因此,一系列相關(guān)的提案被提交。牽涉到上面代碼中的提案就有: DecltypeLambda expressions and closures for C++proposal for new for-loop。  
    其中,最符合foreach要求的就是新的for循環(huán)。采用這個(gè)語句,上面的程序就可以這么寫:
for(const MyClass& item : m_vecData)
{
    
if(!item.IsBusy())
        item.DoSomeThing(param);
}

    不過,考慮到Decltype&auto提案已經(jīng)被采納,新的for-loop就不知道能不能再被采納。因?yàn)槭褂肈ecltype&auto后,程序可以這么寫:
for(auto iter = m_vecData.begin(), end = m_vecData.end(); iter != end; ++iter)
{
    if(!iter->IsBusy())
        iter->DoSomeThing(param);
}
    似乎還是復(fù)雜點(diǎn)是吧?但是有了decltype&auto后,foreach功能可以用程序庫(kù)或宏的形式被模擬,BOOST_FOREACH就是這么做的。具體模擬的方式<<proposal for new for-loop>>提案寫的很清楚了。
    同時(shí),假如lambda提案要是能再被通過的話,那就真的要開心了:
for_each(
  m_vecData, 
  
<>(item) extern(param)
  {
    
if(!item.IsBusy())
        item.DoSomeThing(param);
  }
);
    Cool!

    不過,VC++2008倒是增加了foreach功能,不過關(guān)鍵字不是foreach,而是for each,這個(gè)讓人有點(diǎn)郁悶.要用的時(shí)候最好用宏定義替換一下,免得可移植性上出現(xiàn)問題.

posted on 2007-09-26 19:51 沐楓 閱讀(17022) 評(píng)論(11)  編輯 收藏 引用 所屬分類: C++

Feedback

# re: 從for到foreach 2007-09-26 22:05 danielwyo
for(vector<MyClass>::const_iterator iter = m_vecData.begin(); iter != m_vecData.end(); ++iter)
{
if(!iter->IsBusy())
iter->DoSomeThing(param);
}
----------------------------------
這個(gè)用的最多的了, 也很直觀吧, 干嘛一定要強(qiáng)調(diào)使用foreach呢? 至于對(duì)C++新版本的期待, 我已經(jīng)不抱希望了, 所謂的C++0x也不知道N年才出來, 而正式可以廣泛使用的編譯器, 那更是不知道要到什么時(shí)間了.   回復(fù)  更多評(píng)論
  

# re: 從for到foreach 2007-09-27 06:29 danielwyo
突然注意到了, 你的名字是ly, 跟我老婆的簡(jiǎn)寫一樣. 后面一個(gè)liny, 一看更象.   回復(fù)  更多評(píng)論
  

# re: 從for到foreach 2007-09-27 08:33 螞蟻終結(jié)者
用for來處理container確實(shí)比較麻煩,有時(shí)候for語句還得折行。
估計(jì)新的特性可能還要等不少時(shí)間...  回復(fù)  更多評(píng)論
  

# re: 從for到foreach 2007-09-27 15:13 沐楓
并非完全要期待C++0x,那玩意兒至少要2年呢。

主要是為了希望能提高c++代碼的可讀性。
10多年前,剛學(xué)習(xí)C++的時(shí)候,為其傾倒,首要的,也是它在語言級(jí)上支持類,使得數(shù)據(jù)與算法的封裝變得直觀。
后來又加上函數(shù)重載和操作符重載,使得表達(dá)式變得簡(jiǎn)單清晰。
再后來,模板的出現(xiàn),使得消除重復(fù)代碼的同時(shí)還可以得到類型安全的保證。
這一切都是喜歡C++的理由。

然后,最終發(fā)現(xiàn),這一切也變成容易寫出壞味道甚至難以維護(hù)的代碼的禍?zhǔn)住++語法太過于低級(jí),沒有更高一級(jí)的抽象,造成了對(duì)很多人最終難學(xué)難用難看的印象和后果。

既然無法從語法級(jí)別上進(jìn)行改進(jìn),那就只好從程序庫(kù)中補(bǔ)充。因此,象BOOST等一系列的庫(kù),都在這上面花了不少力氣。有許多人說這些庫(kù)用的“技巧"旁門左道,因此而抵制。事實(shí)上,它們只是為了能夠讓別的人不需要用很深刻的技巧,而打造了一批讓我們可以很順手使用的程序庫(kù)。

foreach 如此,format和assign如此,lambda,functional,bind,xpressive 等等,無不如此。

正是這些庫(kù)能簡(jiǎn)化并提高程序設(shè)計(jì)的效率和可讀性,才有了C++0x的提案和實(shí)踐,也才有了C++語言的進(jìn)化。  回復(fù)  更多評(píng)論
  

# re: 從for到foreach 2007-09-27 16:12 沐楓
@danielwyo
姓林的重名的實(shí)在是沒有辦法避免,我周圍常能找到重名的。更何況拼音。
---
上面的例子實(shí)在是簡(jiǎn)單,因此,還不覺得那個(gè)iterator循環(huán)難看到哪去。一旦復(fù)雜度提高了,再那么寫就很不順眼了。
既使用foreach,也頂多改善一些罷了。

倒是對(duì)于.net引入的LINQ語法,很是向往。SQL當(dāng)初面世的時(shí)候,曾被推寵,但直到今天也僅用于數(shù)據(jù)庫(kù)。真正開始在一般的程序設(shè)計(jì)上普及,看來看去也只有LINQ了。

象上面的例子,用C#3.0寫就是:
m_vecData
  .
Where(item => !item.IsBusy())
  .
All(item => item.DoSomeThing(param));
LINQ則:
var s = from item in m_vecData
        
where !item.IsBusy()
        
select item;
s.
All(item => item.DoSomeThing(param));

如果是用Ruby:
m_vecData.each {|item| !item.IsBusy() and item.DoSomeThing(param)}
  回復(fù)  更多評(píng)論
  

# re: 從for到foreach 2007-09-27 18:35 danielwyo
具體的情況確實(shí)不好說, 而針對(duì)復(fù)雜的for循環(huán), foreach也會(huì)變得復(fù)雜. 我覺得其實(shí)這個(gè)并沒有占有多少優(yōu)勢(shì).

而sql語法本身有一定的缺陷, 被推崇為最新代語法, 其實(shí)在軟件開發(fā)上并不占有優(yōu)勢(shì), 個(gè)人認(rèn)為, 它僅僅是更加接近英語語法而已, 并不是什么重要的改進(jìn). 很多人接觸sql語法也并沒有覺得比其它語法好學(xué).

其實(shí)我就是你上面提到的抵制那些庫(kù)的人, 不過boost還好, 至少其中的regex等比較實(shí)用的東西我還是用的比較多. 我還是更加喜歡ace這種更加實(shí)用的產(chǎn)品.   回復(fù)  更多評(píng)論
  

# re: 從for到foreach 2007-09-27 22:15 missdeer
感覺BOOST_FOREACH好像可能會(huì)有性能問題、、
不過std::for_each+boost::bind/boost::lambda簡(jiǎn)直就是無敵~  回復(fù)  更多評(píng)論
  

# re: 從for到foreach 2007-09-27 22:53 沐楓
@missdeer
好象、可能,這個(gè)說的很不地道。
性能的確會(huì)稍差,但差的是常數(shù)級(jí)別。循環(huán)體內(nèi)是不差的。也就是說,大多數(shù)情況下可以忽略。  回復(fù)  更多評(píng)論
  

# re: 從for到foreach 2007-10-23 16:03 阿鐵
沐楓,你好!
不提供foreach,就沒有限制了,那么你想diy個(gè)forloop也行了.  回復(fù)  更多評(píng)論
  

# re: 從for到foreach[未登錄] 2010-05-17 10:14 123
for_each 性能比 純for加上迭代要高一些  回復(fù)  更多評(píng)論
  

# re: 從for到foreach 2011-01-26 16:43 mickey
C++從VS2005之后就有for each的啊。
vector<MyClass> myVector;
for each(auto element in myVector)
{
//xxx
}  回復(fù)  更多評(píng)論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲伦理精品| 性久久久久久久久久久久| 久久福利毛片| 亚洲激情欧美激情| 99视频精品在线| 国产乱子伦一区二区三区国色天香| 久久久久国产一区二区三区四区 | 国产精品欧美精品| 久久免费99精品久久久久久| 欧美激情在线观看| 久久国产精品久久久久久| 老司机免费视频一区二区| 亚洲一区图片| 午夜精品视频网站| 亚洲精品黄色| 国产女主播一区| 亚洲高清资源| 国外视频精品毛片| 亚洲无亚洲人成网站77777| 亚洲第一偷拍| 欧美亚洲三区| 麻豆精品精华液| 久久精品免费观看| 欧美日韩在线不卡一区| 女人香蕉久久**毛片精品| 国产精品美女久久久浪潮软件| 亚洲国产精品久久91精品| 国产日产亚洲精品| 亚洲私人影院| 亚洲午夜精品久久| 欧美高清视频在线| 免播放器亚洲一区| 国产亚洲激情视频在线| 亚洲视频在线观看一区| 一区二区三区四区五区精品视频| 久久久美女艺术照精彩视频福利播放| 亚洲综合精品自拍| 欧美日韩亚洲系列| 亚洲激情自拍| 亚洲精品网址在线观看| 久久在线91| 免费人成网站在线观看欧美高清| 国产一区二区三区免费在线观看| 亚洲网站视频福利| 亚洲自拍啪啪| 欧美午夜宅男影院| 日韩视频不卡| 亚洲午夜成aⅴ人片| 欧美日韩精品二区| 亚洲乱码国产乱码精品精| 日韩视频一区二区三区在线播放免费观看| 久久天天躁狠狠躁夜夜av| 久久亚洲精品中文字幕冲田杏梨| 国产亚洲观看| 久久久水蜜桃| 亚洲激情成人| 亚洲视频在线观看三级| 欧美性视频网站| 亚洲女优在线| 久久久亚洲欧洲日产国码αv | 国产亚洲一区二区精品| 欧美一级电影久久| 老司机免费视频久久| 好吊妞**欧美| 你懂的一区二区| 亚洲韩国日本中文字幕| 一区二区日韩| 国产欧美韩国高清| 久久深夜福利| 亚洲精品影院在线观看| 亚洲天堂av图片| 国产欧美日韩伦理| 久久婷婷国产综合尤物精品| 亚洲国产精品女人久久久| 亚洲视频电影在线| 国产亚洲欧美激情| 欧美成人蜜桃| 亚洲一区二区三区视频| 久久久久综合网| 亚洲精品日日夜夜| 亚洲香蕉伊综合在人在线视看| 欧美日韩亚洲一区二区三区| 亚洲视频在线观看视频| 久久精品一区中文字幕| 最新中文字幕亚洲| 国产精品高清网站| 久久久999精品| 亚洲美洲欧洲综合国产一区| 欧美专区在线播放| 亚洲国内自拍| 国产伦精品一区二区三区免费 | 国内成+人亚洲| 欧美日韩国产系列| 久久se精品一区二区| 亚洲精品你懂的| 午夜天堂精品久久久久| 亚洲精品1区2区| 国产精品免费在线| 欧美成人免费va影院高清| 亚洲欧美一区二区三区久久 | 好看的日韩视频| 欧美午夜精品久久久久久人妖| 久久久久一区| 亚洲欧美成人综合| 亚洲精品偷拍| 欧美成年人视频网站| 午夜精品一区二区三区在线| 亚洲国产精品va在线看黑人动漫 | 亚洲人成网站777色婷婷| 久久精品国产一区二区三区免费看| 亚洲最新视频在线| 在线成人中文字幕| 国产九区一区在线| 欧美日韩国产美女| 欧美激情小视频| 久久―日本道色综合久久| 亚洲永久免费精品| 夜夜嗨av色一区二区不卡| 亚洲国产激情| 欧美jizz19hd性欧美| 午夜亚洲视频| 亚洲一二三区视频在线观看| 亚洲美女av网站| 91久久综合| 亚洲国产日韩欧美| 亚洲国产婷婷综合在线精品| 红桃av永久久久| 国产中文一区| 狠狠噜噜久久| 黄色成人在线观看| 一区二区在线免费观看| 黄色工厂这里只有精品| 国产日韩成人精品| 国产九区一区在线| 国产欧美精品va在线观看| 国产女主播一区二区三区| 国产精品一区二区欧美| 国产精品视频大全| 国产欧美日韩综合| 国产无一区二区| 韩国v欧美v日本v亚洲v| 狠狠色噜噜狠狠狠狠色吗综合| 国产自产女人91一区在线观看| 国产一区白浆| 伊人久久婷婷色综合98网| 原创国产精品91| 亚洲国产婷婷| 一本大道av伊人久久综合| 亚洲小说区图片区| 亚洲一区二区精品视频| 国产精品女主播| 国产精品日韩精品欧美在线| 国产欧美一区二区三区视频| 国产三级精品三级| 国模私拍视频一区| 最近看过的日韩成人| 宅男在线国产精品| 欧美一区二区久久久| 久久综合成人精品亚洲另类欧美| 欧美91精品| 亚洲精品小视频| 亚洲欧美电影在线观看| 久久精品最新地址| 欧美激情亚洲激情| 国产精品hd| 国内外成人在线| 亚洲三级性片| 亚洲欧美日韩国产精品| 久久精品国产一区二区三区| 欧美va天堂| 正在播放欧美视频| 久久久久久久综合狠狠综合| 欧美久久一级| 国产亚洲二区| 亚洲精品日产精品乱码不卡| 亚洲欧美日韩国产一区二区| 久久综合给合久久狠狠色| 亚洲人屁股眼子交8| 欧美一级大片在线免费观看| 欧美激情精品久久久久久久变态| 国产精品高潮呻吟久久av无限| 樱花yy私人影院亚洲| 亚洲女爱视频在线| 欧美大片免费观看| 亚洲欧美日韩一区在线| 美女精品一区| 国产精品日韩电影| 亚洲精品免费一区二区三区| 久久成人资源| 99re这里只有精品6| 久久综合给合| 国产亚洲欧美一级| 亚洲先锋成人| 欧美激情精品久久久久久大尺度| 亚洲午夜激情免费视频| 欧美精品久久99| 在线看片欧美| 久久嫩草精品久久久精品一| 中文欧美日韩| 欧美精品午夜|