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

沐楓小筑(C++)

愛老婆,要比編程多一點...

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  18 Posts :: 0 Stories :: 84 Comments :: 0 Trackbacks

公告

沐楓的個人主頁

eoool.com生成

eoool.com生成

常用鏈接

留言簿(8)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 57590
  • 排名 - 404

最新評論

閱讀排行榜

評論排行榜

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

    然而,這種情況,到了STL時,就有些變味了:
for(vector<MyClass>::const_iterator iter = m_vecData.begin(); iter != m_vecData.end(); ++iter)
{
    
if(!iter->IsBusy())
        iter
->DoSomeThing(param);
}
    這么長的一個for,不再給人一種清晰的感覺了?;蛟S因為這個程序比較短,還沒有太大的感覺,當回頭去看自已的程序中,有不少這樣的寫法時,我就覺得一陣心煩。改改?
for(size_t i = 0; i < m_vecData.size(); ++i)
{
    
if(!m_vecData[i].IsBusy())
        m_vecData[i].DoSomeThing(param);
}
    不錯,還是簡單點好啊。但是因為這里舉的是vector的例子。如果是list或是別的什么容器,就行不通了。
    其它的高級語言,都提供了foreach或是for in語句,寫出來就很清晰:
foreach(item in m_vecData)
{
    
if(!item.IsBusy())
        item.DoSomeThing(param);
}
    C++是不是也可以這么簡單?好象STL中也有一個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));
    不錯,for語句簡單了,但是卻多了IfNotBusyThenDoSomeThing的定義,這代碼可是多了好幾倍。要是每個循環都要來這么一下,我還不如直接寫for,要來得爽快一些?;蛟S還有別的辦法:
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&>,因為不能建立指向引用的指針。這就要求MyClass是可拷貝的。但就算是可拷貝的,有時候拷貝成本也是很高的。
    2. MyClass::DoSomeThing的參數不能是引用(我們常定義參數為:const Param&),因為不能定義引用的引用這種類型。
    3. 一旦出現錯誤,這錯誤信息會讓人極其昏倒。

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

    好了,問題來了,為什么C++不直接在語言中提供foreach這個功能呢?
    個人認為,原因有幾點:
    1. C/C++除了數組外,沒有內置的容器,因此for語句足矣。
    2. 當C++進化到STL的時候,C++標準委員會根本沒空去考慮其它的。
    而其它高級語言之所以內置了foreach,就是因為它們一開始就提供了標準的容器庫和迭代/枚舉接口,因此提供foreach就順理成章了。

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

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

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

posted on 2007-09-26 19:51 沐楓 閱讀(17022) 評論(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);
}
----------------------------------
這個用的最多的了, 也很直觀吧, 干嘛一定要強調使用foreach呢? 至于對C++新版本的期待, 我已經不抱希望了, 所謂的C++0x也不知道N年才出來, 而正式可以廣泛使用的編譯器, 那更是不知道要到什么時間了.   回復  更多評論
  

# re: 從for到foreach 2007-09-27 06:29 danielwyo
突然注意到了, 你的名字是ly, 跟我老婆的簡寫一樣. 后面一個liny, 一看更象.   回復  更多評論
  

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

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

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

然后,最終發現,這一切也變成容易寫出壞味道甚至難以維護的代碼的禍首。C++語法太過于低級,沒有更高一級的抽象,造成了對很多人最終難學難用難看的印象和后果。

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

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

正是這些庫能簡化并提高程序設計的效率和可讀性,才有了C++0x的提案和實踐,也才有了C++語言的進化。  回復  更多評論
  

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

倒是對于.net引入的LINQ語法,很是向往。SQL當初面世的時候,曾被推寵,但直到今天也僅用于數據庫。真正開始在一般的程序設計上普及,看來看去也只有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)}
  回復  更多評論
  

# re: 從for到foreach 2007-09-27 18:35 danielwyo
具體的情況確實不好說, 而針對復雜的for循環, foreach也會變得復雜. 我覺得其實這個并沒有占有多少優勢.

而sql語法本身有一定的缺陷, 被推崇為最新代語法, 其實在軟件開發上并不占有優勢, 個人認為, 它僅僅是更加接近英語語法而已, 并不是什么重要的改進. 很多人接觸sql語法也并沒有覺得比其它語法好學.

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

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

# re: 從for到foreach 2007-09-27 22:53 沐楓
@missdeer
好象、可能,這個說的很不地道。
性能的確會稍差,但差的是常數級別。循環體內是不差的。也就是說,大多數情況下可以忽略。  回復  更多評論
  

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

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久.com| 亚洲人www| 亚洲欧美日韩国产综合在线 | 美女视频黄 久久| 久久xxxx精品视频| 亚洲欧美日韩爽爽影院| 国产精品美女久久久浪潮软件| 欧美精品在线观看一区二区| 欧美国产乱视频| 欧美一区二区| 母乳一区在线观看| 欧美国产丝袜视频| 国产精品国产三级国产aⅴ入口| 欧美精品一区三区在线观看| 欧美高清在线观看| 国产精品毛片a∨一区二区三区| 国产精品国产一区二区| 国产精品亚洲综合天堂夜夜 | 欧美色另类天堂2015| 欧美日韩在线视频一区二区| 欧美图区在线视频| 国外成人在线| 亚洲国产成人av好男人在线观看| 亚洲一区二区三区精品在线观看| 免费欧美在线| 欧美日韩第一区| 国产精品久久久久久久午夜 | 欧美天堂亚洲电影院在线播放| 国产精品日韩在线观看| 国产日韩一区二区三区| 伊人狠狠色j香婷婷综合| 一片黄亚洲嫩模| 久久精品国产亚洲高清剧情介绍| 久久综合中文色婷婷| 9l视频自拍蝌蚪9l视频成人| 亚洲在线电影| 免费在线观看一区二区| 国产日韩欧美麻豆| 亚洲国产网站| 久久久国产精品一区| 亚洲黄色性网站| 亚洲视频免费观看| 欧美成人亚洲成人| 国产欧美日韩在线播放| 亚洲精品护士| 欧美成人官网二区| 亚洲欧美激情诱惑| 亚洲综合色激情五月| 亚洲大片精品永久免费| 午夜激情综合网| 亚洲少妇自拍| 欧美成人官网二区| 国产日韩一区二区| 欧美一区二区视频在线| 亚洲国产另类 国产精品国产免费| 亚洲一区二区在线免费观看| 欧美精选午夜久久久乱码6080| 国产午夜精品全部视频在线播放| 一本久久精品一区二区| 亚洲电影欧美电影有声小说| 欧美一区二区视频在线观看2020| 国产精品高潮呻吟久久av无限 | 在线电影院国产精品| 欧美在线观看一二区| 亚洲欧美另类中文字幕| 欧美午夜久久久| 日韩亚洲欧美一区| av成人免费在线| 欧美乱大交xxxxx| 亚洲人成高清| 日韩午夜在线播放| 免费久久精品视频| 久久精品一区二区| 亚洲黄一区二区| 国产精品一区二区三区成人| 欧美日韩xxxxx| 一本大道久久a久久综合婷婷| 男人的天堂亚洲在线| 久久精品人人做人人爽| 亚洲国产精品第一区二区三区| 久久精品视频播放| 久久国产精品毛片| 亚洲精品免费一二三区| 欧美岛国激情| 欧美一级午夜免费电影| 在线看片成人| 欧美激情一区在线| 国产精品成av人在线视午夜片| 亚洲特黄一级片| 亚洲图中文字幕| 韩国自拍一区| 欧美激情导航| 欧美日韩精品一区视频| 99riav久久精品riav| 99精品国产一区二区青青牛奶| 国产麻豆精品theporn| 久久人人97超碰精品888| 欧美在线电影| 中文精品在线| 香蕉成人伊视频在线观看| 欧美亚洲第一区| 欧美 日韩 国产在线| 欧美激情视频在线播放| 久久本道综合色狠狠五月| 久久天天躁狠狠躁夜夜爽蜜月 | 亚洲欧美综合v| 亚洲欧美综合精品久久成人| 国产精品一区二区在线观看| 欧美黑人多人双交| 国产精品久久一级| 另类专区欧美制服同性| 国产精品久久久久影院色老大| 久久精品欧美| 久久婷婷色综合| 久久久精品免费视频| 欧美激情一区二区三区不卡| 久久青草久久| 欧美午夜精品一区二区三区| 久久综合九色综合网站| 国产精品捆绑调教| 欧美国产视频在线| 欧美日韩亚洲三区| 美腿丝袜亚洲色图| 国产精品久久波多野结衣| 亚洲黄色大片| 国产亚洲综合在线| 欧美成人午夜免费视在线看片| 国产乱码精品1区2区3区| 亚洲高清资源| 亚洲国产电影| 久久九九国产精品| 午夜精品久久久久久久99热浪潮| 欧美激情a∨在线视频播放| 久久精品国产欧美激情| 欧美 日韩 国产在线| 欧美高清你懂得| 国产精品美女久久久久久免费| 欧美小视频在线观看| 亚洲精品在线三区| 亚洲激情影视| 久久久久免费视频| 免费观看久久久4p| 激情五月综合色婷婷一区二区| 欧美资源在线观看| 欧美一区二视频| 国产精品家教| 日韩视频一区二区在线观看| 国产日韩在线亚洲字幕中文| 亚洲宅男天堂在线观看无病毒| 日韩视频免费观看| 欧美日韩伦理在线| 亚洲美女在线看| 韩国久久久久| 欧美va亚洲va香蕉在线| 麻豆精品传媒视频| 亚洲人成网站色ww在线| 免费在线看成人av| 亚洲二区视频在线| 一本久久综合| 欧美视频在线观看免费| 亚洲在线观看免费视频| 欧美一区二区三区喷汁尤物| 国产精品福利在线| 久久狠狠一本精品综合网| 久久久噜噜噜久久中文字免| 影音先锋中文字幕一区| 免费一区二区三区| av成人福利| 久久久久久尹人网香蕉| 国产精品永久免费在线| 久久综合网hezyo| 亚洲国产欧美在线| 午夜视频精品| 国产综合欧美在线看| 亚洲小少妇裸体bbw| 免费成人网www| 99国产精品久久久久久久成人热| 国产精品日韩一区二区| 久久精品日韩欧美| 亚洲私拍自拍| 很黄很黄激情成人| 欧美成人久久| 性欧美超级视频| 欧美激情影院| 久久久久久久97| 亚洲免费观看高清在线观看| 国产精品v欧美精品v日韩 | 国产精品欧美久久| 欧美在线电影| 亚洲美女淫视频| 欧美国产欧美亚洲国产日韩mv天天看完整 | 国产欧美日韩伦理| 久久在精品线影院精品国产| 亚洲精品1区2区| a4yy欧美一区二区三区| 国产日韩精品在线观看| 亚洲性夜色噜噜噜7777| 亚洲福利在线观看| 欧美亚洲一区二区在线| 亚洲高清在线|