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

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>
            欧美日韩亚洲成人| 亚洲第一级黄色片| 最近中文字幕日韩精品| 久久一二三区| 亚洲电影在线免费观看| 欧美成人免费全部| 蜜臀久久99精品久久久久久9 | 国内久久婷婷综合| 欧美11—12娇小xxxx| 狼人天天伊人久久| 亚洲精品久久视频| 亚洲日本欧美| 国产人妖伪娘一区91| 欧美激情黄色片| 国产伦精品一区二区三区高清| 亚洲桃花岛网站| 久久久av毛片精品| 亚洲午夜伦理| 久久嫩草精品久久久精品一| 日韩天堂在线观看| 亚洲一级在线| 亚洲最快最全在线视频| 国产一区二区按摩在线观看| 另类图片国产| 国产亚洲成人一区| 亚洲视频网在线直播| 亚洲国产老妈| 久久裸体视频| 久久麻豆一区二区| 国产欧美日韩综合一区在线观看| 欧美成人精品高清在线播放| 欧美日韩中字| 一区二区三区欧美| 日韩午夜激情av| 麻豆av福利av久久av| 欧美成人精品激情在线观看| 国产日韩欧美一区二区三区在线观看 | 欧美日韩日本网| 亚洲第一网站免费视频| 亚洲国产精品悠悠久久琪琪| 欧美一级视频精品观看| 欧美在线播放| 136国产福利精品导航| 久久乐国产精品| 欧美福利影院| 亚洲一区二区免费视频| 欧美亚日韩国产aⅴ精品中极品| 日韩视频精品在线观看| 午夜精品av| 狠狠色狠色综合曰曰| 久久精品一本| 一本色道久久综合亚洲二区三区| 亚洲小说欧美另类社区| 国产一区在线视频| 欧美日韩国产小视频| 亚洲在线一区| 91久久久亚洲精品| 欧美专区在线观看一区| 一片黄亚洲嫩模| 韩国av一区二区三区| 国产精品v日韩精品v欧美精品网站| 亚洲欧美日韩国产成人精品影院| 亚洲欧美99| 亚洲区在线播放| 国产人成精品一区二区三| 中文日韩在线视频| 91久久午夜| 国产欧美精品久久| 欧美日本免费| 久久精品亚洲乱码伦伦中文| 一区二区三区四区国产| 亚洲国产精品久久久久秋霞蜜臀| 欧美亚洲专区| 欧美在线短视频| 欧美制服丝袜| 久久国产加勒比精品无码| 亚洲午夜在线观看| 亚洲欧美日韩久久精品| 亚洲一区3d动漫同人无遮挡| aa亚洲婷婷| 国产精品99久久99久久久二8| 9l国产精品久久久久麻豆| 亚洲国产一区二区在线| 99精品黄色片免费大全| 在线看片成人| 一本色道久久88综合亚洲精品ⅰ | 久久―日本道色综合久久| 久久精品女人天堂| 久久―日本道色综合久久| 久久激情五月激情| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久综合色影院| 亚洲国产精品久久人人爱蜜臀| 欧美高清视频一区二区| 亚洲欧洲免费视频| 午夜精品久久久久久久久| 午夜久久久久久| 美女亚洲精品| 国产精品美女一区二区在线观看| 国产精品毛片va一区二区三区| 国产一区99| 亚洲乱码久久| 久久精品成人| 亚洲激情视频在线播放| 亚洲在线免费| 欧美日韩综合视频网址| 黄色av日韩| 欧美一级网站| 一区二区三区高清在线| 嫩草国产精品入口| 极品少妇一区二区三区| 新狼窝色av性久久久久久| 美女日韩欧美| 欧美一区二区在线看| 国产精品xnxxcom| 一区二区三区免费网站| 欧美高清视频一区二区三区在线观看| 日韩视频免费观看高清在线视频| 免费观看一级特黄欧美大片| 欧美日韩精品一本二本三本| 欧美日韩在线一区| 亚洲男人第一av网站| 亚洲免费中文| 黑人巨大精品欧美一区二区小视频| 午夜天堂精品久久久久| 午夜精品久久久久久久99热浪潮| 国产精品v日韩精品| 久久国产精品99精品国产| 亚洲国产精品福利| 欧美日韩国产精品一区二区亚洲| 一本色道久久88亚洲综合88| 亚洲欧美视频| 久久精彩视频| 一区二区三区四区国产精品| 亚洲一级免费视频| 欧美午夜一区| 麻豆成人精品| 欧美va亚洲va香蕉在线| 亚洲欧美日本在线| 亚洲欧美日韩直播| 一本久久综合| 快she精品国产999| 欧美一区在线看| 欧美成ee人免费视频| 亚洲尤物在线视频观看| 另类亚洲自拍| 久久人人爽爽爽人久久久| 欧美日韩中文字幕在线视频| 欧美激情影院| 亚洲第一中文字幕| 久久av资源网站| 久久精品人人做人人爽| 国产精品推荐精品| 亚洲伊人伊色伊影伊综合网| 一本大道av伊人久久综合| 老司机免费视频久久| 久久嫩草精品久久久精品| 国产一区白浆| 久久嫩草精品久久久精品一| 久久激情综合网| 国产精品高潮呻吟久久| 99日韩精品| 欧美在线观看日本一区| 国产一区二区三区在线观看精品| 99热在这里有精品免费| 亚洲午夜精品视频| 国产欧美日韩三区| 久久精品视频va| 亚洲二区视频| 久久av一区二区三区漫画| 精品69视频一区二区三区| 男人天堂欧美日韩| 午夜天堂精品久久久久| 久久综合中文| 午夜精品福利在线| 亚洲欧洲在线播放| 国产精品永久| 欧美日韩国产不卡| 久久久精品日韩欧美| 亚洲一区二区三区精品动漫| 久久精品国产一区二区三| 国产一区二区三区在线观看网站| 欧美一级理论性理论a| 久久国产精品久久精品国产| 亚洲香蕉网站| 欧美另类一区二区三区| 久久在线视频在线| 久久综合激情| 中文在线一区| 欧美激情一区二区三区在线 | 一区二区日韩免费看| 欧美一区日本一区韩国一区| 亚洲人成网站在线观看播放| 久久久久久久999精品视频| 美日韩精品视频| 亚洲高清资源综合久久精品| 久久精品中文字幕一区| 亚洲国产另类 国产精品国产免费| 在线播放不卡| 欧美极品一区|