• <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>

            沐楓小筑(C++)

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

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

            公告

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

            eoool.com生成

            eoool.com生成

            常用鏈接

            留言簿(8)

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

            搜索

            •  

            積分與排名

            • 積分 - 57113
            • 排名 - 402

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

                一直在使用C/C++,對(duì)于循環(huán)語(yǔ)句while、do while、for,對(duì)于for情有獨(dú)鐘,因?yàn)槠浜?jiǎn)潔、清晰、靈活。訪問(wèn)數(shù)組類型的變量,只有for寫(xiě)出來(lái)的語(yǔ)句是最易于閱讀的,如:
            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,不再給人一種清晰的感覺(jué)了?;蛟S因?yàn)檫@個(gè)程序比較短,還沒(méi)有太大的感覺(jué),當(dāng)回頭去看自已的程序中,有不少這樣的寫(xiě)法時(shí),我就覺(jué)得一陣心煩。改改?
            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í)語(yǔ)言,都提供了foreach或是for in語(yǔ)句,寫(xiě)出來(lái)就很清晰:
            foreach(item in m_vecData)
            {
                
            if(!item.IsBusy())
                    item.DoSomeThing(param);
            }
                C++是不是也可以這么簡(jiǎn)單?好象STL中也有一個(gè)for_each,試著改寫(xiě)一下:
            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語(yǔ)句簡(jiǎn)單了,但是卻多了IfNotBusyThenDoSomeThing的定義,這代碼可是多了好幾倍。要是每個(gè)循環(huán)都要來(lái)這么一下,我還不如直接寫(xiě)for,要來(lái)得爽快一些。或許還有別的辦法:
            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));
                天哪,這種寫(xiě)法好象更恐怖。而且,還不是每種情況都能用的:
                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ì)讓人極其昏倒。

                看來(lái)單靠標(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ò),好了一些,但是還是很不好看。有沒(méi)有更好的?有,boost1.34新加入的BOOST_FOREACH:
            BOOST_FOREACH(cosnt MyClass& item, m_vecData)
            {
                
            if(!item.IsBusy())
                    item.DoSomeThing(param);
            }
                Oh Yeah!

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

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

                不過(guò),考慮到Decltype&auto提案已經(jīng)被采納,新的for-loop就不知道能不能再被采納。因?yàn)槭褂肈ecltype&auto后,程序可以這么寫(xiě):
            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>>提案寫(xiě)的很清楚了。
                同時(shí),假如lambda提案要是能再被通過(guò)的話,那就真的要開(kāi)心了:
            for_each(
              m_vecData, 
              
            <>(item) extern(param)
              {
                
            if(!item.IsBusy())
                    item.DoSomeThing(param);
              }
            );
                Cool!

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

            posted on 2007-09-26 19:51 沐楓 閱讀(16992) 評(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年才出來(lái), 而正式可以廣泛使用的編譯器, 那更是不知道要到什么時(shí)間了.   回復(fù)  更多評(píng)論
              

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

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

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

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

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

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

            foreach 如此,format和assign如此,lambda,functional,bind,xpressive 等等,無(wú)不如此。

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

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

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

            象上面的例子,用C#3.0寫(xiě)就是:
            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í)不好說(shuō), 而針對(duì)復(fù)雜的for循環(huán), foreach也會(huì)變得復(fù)雜. 我覺(jué)得其實(shí)這個(gè)并沒(méi)有占有多少優(yōu)勢(shì).

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

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

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

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

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

            # re: 從for到foreach[未登錄](méi) 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)論
              

            久久Av无码精品人妻系列| 99久久久精品| 久久久久av无码免费网| 久久久亚洲裙底偷窥综合 | 久久亚洲AV无码西西人体| 亚洲国产天堂久久久久久| 久久综合88熟人妻| 四虎影视久久久免费| 精品熟女少妇a∨免费久久| 国产精品综合久久第一页| 久久伊人五月丁香狠狠色| 91久久精品无码一区二区毛片| 久久频这里精品99香蕉久| 精品一区二区久久久久久久网站| 一级A毛片免费观看久久精品| 99久久人妻无码精品系列| 亚洲综合久久夜AV | 91亚洲国产成人久久精品| 久久精品国产免费观看| 久久亚洲AV无码西西人体| 久久久久免费精品国产| 久久99国产综合精品女同| 中文字幕久久亚洲一区| 久久久精品国产亚洲成人满18免费网站 | 精品久久久久久中文字幕大豆网| 国产精品VIDEOSSEX久久发布| 性欧美丰满熟妇XXXX性久久久| 久久久久亚洲AV无码专区桃色| 久久国产精品无码一区二区三区 | 久久久久久国产精品无码超碰| 久久国产视频99电影| 94久久国产乱子伦精品免费 | 久久强奷乱码老熟女网站| 99久久精品费精品国产一区二区 | 91精品国产91热久久久久福利| 久久亚洲精品国产精品| 色欲综合久久中文字幕网| 久久午夜福利无码1000合集| 久久大香萑太香蕉av| 一本色道久久综合狠狠躁 | 国产A级毛片久久久精品毛片|