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

Impossible is nothing  
  愛過知情重醉過知酒濃   花開花謝終是空   緣份不停留像春風來又走   女人如花花似夢
公告
日歷
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
統計
  • 隨筆 - 8
  • 文章 - 91
  • 評論 - 16
  • 引用 - 0

導航

常用鏈接

留言簿(4)

隨筆分類(4)

隨筆檔案(8)

文章分類(77)

文章檔案(91)

相冊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 

總有一些時候,我們不能夠借助于“生成式”的初始化方法來給容器賦值,例如我們已經有了一個數組,要把它作為初值賦給一個容器,常規的做法已經深入人心了

總有一些時候,我們不能夠借助于“生成式”的初始化方法來給容器賦值,例如我們已經有了一個數組,要把它作為初值賦給一個容器,常規的做法已經深入人心了:

? int init[] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
? std::vector<int> vect(init, init + sizeof(init)/sizeof(int));

通過兩個 sizeof 來得到數組的大小在 C 語言里面是很常見的,然而在 C++ 里面,這即便不能稱為丑陋,也絕對稱不上是好。首先其可讀性不好,其次它要進行一次除法來得到一個本來在編譯期間就知道的數字,最后,它并不是總能用的!例如下面的例子:

? std::string strs[] = { "Amy", "Ralph", "Simon", "Maggie" };

現在,你打算用 "sizeof " 什么來除以 "sizeof" 什么?

其實,經過了這么多 C++ GP 的磨練,我們很容易就會想到一個在編譯期間得到靜態數組大小的辦法,模板偏特化是我們常用的武器,在這里非常好用:

template <class T>
struct ArraySize
{
??? static const unsigned int value = 0;
};

template <class T, int S>
struct ArraySize<T[S]>
{
??? static const unsigned int value = S;
};

就這么簡單!雖然它只對付一維數組,但是擴展它是很容易的。不過,模板參數只能為類型,而我們需要傳入的是一個變量。好在在計算機科學里面,加一層抽象是可以解決任何問題的,我們只要加一個模板函數,C++ 會自動幫我們做類型推導:

template <class T>
unsigned int array_size(const T&)
{
??? return ArraySize<T>::value;
}

現在我們可以輕而易舉的搞定那些數組了:

? int ints[] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
? std::vector<int> vint(ints, ints + array_size(ints));
?
? std::string strs[] = { "Amy", "Ralph", "Simon", "Maggie" };
? std::vector<std::string> vstr(strs, strs + array_size(strs));
?
? std::for_each(vint.begin(), vint.end(), std::cout << _1 << " ");
? std::cout << std::endl;
? std::for_each(vstr.begin(), vstr.end(), std::cout << _1 << " ");

輸出:

2 3 5 7 11 13 17 19 23
Amy Ralph Simon Maggie

順便說一下,在 boost.type_traits 里面有一個類似于 ArraySize 的工具,叫做 extent ,它更加強大,可以對付多維數組,不過是否值得為了這個而把 boost.type_traits 包含到工程里面去就看讀者自己抉擇了。

=================================================================================

容器的初始化是如此的常見,以至于 boost 提供了一個 assign 庫來簡化這些操作。boost.assign 大量利用了重載的逗號和括號來簡化賦值操作,提供了甚至比用數組更加簡潔的語法:

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

#include <boost/assign/std/vector.hpp>
#include <boost/assign/std/list.hpp>

using namespace boost::assign;

int main()
{
? std::vector<int> vint;
? vint += 2,3,5,7,11,13,17,19,23;
?
? std::vector<std::string> vstr;
? vstr += "Amy","Ralph","Simon","Maggie";
?
? std::list<std::string> lstr;
? lstr += "Amy","Ralph","Simon","Maggie";
???
? std::for_each(vint.begin(), vint.end(), std::cout << _1 << " ");
? std::cout << std::endl;
? std::for_each(vstr.begin(), vstr.end(), std::cout << _1 << " ");
? std::cout << std::endl;
? std::for_each(lstr.begin(), lstr.end(), std::cout << _1 << " ");
}


運行這個程序,輸出與前面的大致相同,但是我們注意到初始化更加簡潔了,而且也不需要額外的空間來存儲數組,對于各種類型,都能夠以統一的方式來初始化,真是妙不可言。有趣的是 assign 的作者在文檔中還特意引用了 Bjarne Stroustrup 的話作為引子:

There appear to be few practical uses of operator,().
Bjarne Stroustrup, The Design and Evolution of C++

這也許就是 C++ 最大的魅力之一:你無法預料它可以辦到些什么。

下面關于 map 的例子也使用 boost.assign ,可以看到重載的括號給我們帶來了多少方便。

#include <iostream>
#include <algorithm>
#include <map>
#include <string>

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

#include <boost/assign/list_inserter.hpp>
#include <boost/assign/list_of.hpp>

using namespace std;
using namespace boost::assign;
using namespace boost::lambda;

int main()
{
? map<string,int> months;?
?
? insert( months )
??? ( "january",?? 31 )( "february", 28 )
??? ( "march",???? 31 )( "april",??? 30 )
??? ( "may",?????? 31 )( "june",???? 30 )
??? ( "july",????? 31 )( "august",?? 31 )
??? ( "september", 30 )( "october",? 31 )
??? ( "november",? 30 )( "december", 31 );
???
? map<int,string> persons = map_list_of
??? (2,"Amy")(3,"Ralph")
??? (5,"Simon")(7,"Maggie");
???
? for_each( months.begin(), months.end(),
??? cout << bind(&map<string,int>::value_type::second, _1) << "\t"
???????? << bind(&map<string,int>::value_type::first, _1) << "\n"
? );
? cout << endl;
? for_each( persons.begin(), persons.end(),
??? cout << bind(&map<int,string>::value_type::first, _1) << "\t"
???????? << bind(&map<int,string>::value_type::second, _1) << "\n"
? );?
}

輸出:

30????? april
31????? august
31????? december
28????? february
31????? january
31????? july
30????? june
31????? march
31????? may
30????? november
31????? october
30????? september

2?????? Amy
3?????? Ralph
5?????? Simon
7?????? Maggie

posted on 2006-06-28 13:45 笑笑生 閱讀(159) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
Copyright © 笑笑生 Powered by: 博客園 模板提供:滬江博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美国产日韩亚洲一区| 亚洲国产一区二区三区青草影视| 一区二区激情| 亚洲一区二区av电影| 国产精品久久久一区麻豆最新章节| 在线一区二区三区四区| 午夜国产精品视频| 国产真实久久| 欧美成人有码| 亚洲欧美不卡| 欧美成人a视频| 亚洲深夜福利| 激情亚洲网站| 欧美日韩在线看| 欧美影院在线播放| 一区二区三区成人| 国产区亚洲区欧美区| 久久一区二区三区av| 99精品国产福利在线观看免费 | 久久九九久精品国产免费直播| 久久夜色撩人精品| 欧美xart系列高清| 久久高清免费观看| 亚洲免费成人| 国产在线高清精品| 欧美日韩亚洲一区二区三区在线| 午夜精品亚洲| 亚洲国产mv| 亚洲欧美在线一区| 亚洲人成77777在线观看网| 国产精品亚洲综合| 欧美经典一区二区三区| 久久av一区二区三区| 一本不卡影院| 欧美黄色片免费观看| 欧美一激情一区二区三区| 亚洲精品国产拍免费91在线| 国产精品亚洲一区二区三区在线| 亚洲毛片在线| 欧美国产日韩免费| 久久国产精品久久久久久| 一区二区三区日韩欧美| 在线观看亚洲一区| 国产日韩欧美一区在线| 欧美午夜在线视频| 欧美大片在线影院| 可以免费看不卡的av网站| 亚洲人成网站色ww在线| 欧美日韩一区二区三区在线视频 | 久久久天天操| 亚洲午夜激情免费视频| 欧美天天影院| 亚洲一区久久久| 亚洲伦理网站| 亚洲精品看片| 最新中文字幕亚洲| 欧美国产亚洲视频| 麻豆亚洲精品| 麻豆精品视频在线| 久久久综合精品| 久久网站热最新地址| 久久成人人人人精品欧| 午夜久久一区| 国产欧美日韩不卡| 国产精品五区| 国产女人18毛片水18精品| 欧美午夜一区二区| 国产精品乱码一区二区三区| 欧美视频精品在线观看| 欧美午夜电影网| 欧美午夜视频在线观看| 国产精品v日韩精品| 欧美在线视频日韩| 亚洲欧美一区二区原创| 亚洲欧美日韩国产中文| 亚洲欧美综合精品久久成人 | 欧美国产日韩视频| 亚洲成在人线av| 亚洲国产精品一区二区尤物区| 欧美mv日韩mv国产网站app| 欧美黄色大片网站| 亚洲精品久久| 亚洲小说区图片区| 性色av一区二区三区| 久久国产精品黑丝| 免费日韩av电影| 久久婷婷av| 亚洲第一中文字幕| 欧美顶级少妇做爰| 欧美揉bbbbb揉bbbbb| 国产精品日韩欧美一区二区| 国产日韩欧美亚洲| 1000部精品久久久久久久久| 亚洲看片一区| 香蕉乱码成人久久天堂爱免费 | 亚洲欧美日产图| 久久精品导航| 在线观看中文字幕亚洲| 欧美三级乱码| 国产原创一区二区| 亚洲精品久久久久久久久久久久| 在线一区二区三区四区| 久久精品国产精品亚洲| 欧美88av| 亚洲一区二区久久| 久热国产精品| 国产精品久久波多野结衣| 国产精品一区二区久久| 亚洲国产精品成人综合| 亚洲午夜伦理| 牛牛国产精品| 亚洲一区二区三区视频播放| 久久亚洲精品中文字幕冲田杏梨| 欧美日韩国产小视频| 国产午夜精品久久| 夜夜爽夜夜爽精品视频| 亚洲高清久久网| 午夜精品福利一区二区三区av| 久久男女视频| 这里只有精品丝袜| 麻豆精品一区二区av白丝在线| 国产精品video| 91久久一区二区| 久久久久久高潮国产精品视| 国产精品无人区| 老司机久久99久久精品播放免费 | 亚洲一二区在线| 久久综合影音| 国产日韩欧美一二三区| 亚洲视频日本| 欧美激情精品久久久久久免费印度| 亚洲天堂av在线免费观看| 老司机亚洲精品| 国产综合色产| 欧美在线观看天堂一区二区三区| 亚洲人成在线观看网站高清| 久久精品综合| 国产美女精品一区二区三区| aa国产精品| 欧美国产第一页| 久久久久久久久久久久久女国产乱| 亚洲一区二区精品| 欧美日韩国产影院| 亚洲区中文字幕| 欧美大片91| 久久婷婷麻豆| 精品电影在线观看| 久久成人精品电影| 亚洲欧美区自拍先锋| 欧美日韩亚洲另类| 亚洲美女视频网| 亚洲国产裸拍裸体视频在线观看乱了中文 | 9久re热视频在线精品| 欧美 日韩 国产精品免费观看| 香蕉久久一区二区不卡无毒影院 | 99精品视频免费| 欧美激情精品久久久久久| 亚洲激情六月丁香| 欧美二区在线看| 久久亚洲国产成人| 在线视频观看日韩| 国产精品入口日韩视频大尺度| 亚洲先锋成人| 国产精品免费一区二区三区在线观看 | 亚洲成色精品| 国产精品久久久爽爽爽麻豆色哟哟| 国内精品久久久久久久果冻传媒| 久久大综合网| 久久久久成人精品| 亚洲电影免费在线 | 亚洲大片精品永久免费| 欧美fxxxxxx另类| 一本久久a久久精品亚洲| 亚洲七七久久综合桃花剧情介绍| 欧美国产高清| 亚洲香蕉在线观看| 亚洲欧美日韩在线| 在线播放日韩专区| 亚洲国产精品成人综合色在线婷婷| 欧美激情一区二区三级高清视频| 亚洲毛片播放| 亚洲视频视频在线| 国产日韩欧美在线播放| 美女网站久久| 欧美精品一区二区三区在线看午夜| 国产精品久久久久久久久果冻传媒 | 午夜精品一区二区三区四区| 激情婷婷亚洲| 91久久久久久久久久久久久| 欧美日韩中文字幕精品| 欧美一区二区三区精品| 久久精品夜色噜噜亚洲a∨| 欧美a级片网| 国产一区二区三区奇米久涩| 欧美成人精品激情在线观看| 欧美日韩国产不卡在线看| 香蕉免费一区二区三区在线观看 | 欧美一级网站| 欧美大秀在线观看| 欧美三级日本三级少妇99|