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

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精品欧美一区二区三区| 一卡二卡3卡四卡高清精品视频| 欧美一区2区三区4区公司二百| 久久久久一区二区三区四区| 91久久国产综合久久| 亚洲日本在线观看| 国产精品ⅴa在线观看h| 久久久精品性| 欧美区在线播放| 欧美一区二区三区精品电影| 久久久久中文| 亚洲一区精品视频| 久久精品日韩一区二区三区| 亚洲精品综合精品自拍| 一区二区日韩伦理片| 国内精品久久久久久久97牛牛| 亚洲免费在线视频一区 二区| 美日韩精品视频| 欧美日韩直播| 欧美韩日高清| 国产日韩精品在线| 亚洲靠逼com| 国产一区二区精品丝袜| 日韩视频在线观看| 在线观看成人网| 亚洲午夜电影在线观看| 亚洲黄色在线看| 欧美一区二区在线| 亚洲在线观看视频| 欧美激情一区二区三区不卡| 久久亚洲精品伦理| 欧美性片在线观看| 亚洲精品国产日韩| 亚洲国产另类久久精品| 欧美在线视频免费播放| 亚洲综合导航| 欧美精品久久久久久| 麻豆精品视频| 国产亚洲毛片在线| 亚洲一区亚洲二区| 亚洲影视在线播放| 欧美私人网站| 日韩视频一区二区三区在线播放免费观看 | 亚洲一区二区三区视频播放| 在线不卡中文字幕| 欧美在线看片| 久久精品视频免费观看| 国产精品美女999| 一区二区三区四区国产精品| a4yy欧美一区二区三区| 欧美激情va永久在线播放| 欧美国产高清| 亚洲高清毛片| 美女黄网久久| 亚洲二区视频| 亚洲精品国产精品国产自| 久久尤物视频| 欧美成人一品| 亚洲精品免费网站| 欧美激情亚洲综合一区| 亚洲精品美女久久久久| 中文国产成人精品| 欧美香蕉视频| 亚洲欧美久久| 久久综合九色综合久99| 伊人成人开心激情综合网| 久久影院午夜论| 亚洲国产一区二区三区青草影视 | 91久久精品国产91久久性色| 亚洲福利视频一区| 蜜臀av国产精品久久久久| 浪潮色综合久久天堂| 亚洲国产精品久久久久久女王 | 欧美在线一二三区| 国产一区二区三区丝袜| 久久亚洲精选| 日韩一级片网址| 翔田千里一区二区| 好看的亚洲午夜视频在线| 久久久午夜电影| 亚洲人成在线观看| 欧美在线日韩在线| 伊人伊人伊人久久| 欧美日韩一区二区三区在线视频| 狼人社综合社区| 99v久久综合狠狠综合久久| 国产精品美女一区二区| 久久久精品日韩| 亚洲免费高清| 久久精品国产99国产精品澳门| 欧美成人国产一区二区| 亚洲欧洲日韩综合二区| 久久精品91| 亚洲美女黄网| 国产日韩欧美中文| 欧美乱大交xxxxx| 欧美亚洲一区在线| 亚洲人成高清| 裸体歌舞表演一区二区| 亚洲午夜久久久久久久久电影院| 欧美精品日韩三级| 欧美专区在线观看| 91久久精品一区二区三区| 亚洲欧美日本国产专区一区| 亚洲国产精品一区二区www| 亚洲成色777777在线观看影院| 夜色激情一区二区| 国产精品亚洲аv天堂网| 久久久久久成人| av72成人在线| 先锋影音国产精品| 一本综合久久| 亚洲国产欧美一区| 美女亚洲精品| 欧美日韩亚洲综合| 欧美不卡在线| 久久国产夜色精品鲁鲁99| 亚洲影音一区| 另类亚洲自拍| 久久免费视频在线| 欧美一区二区在线看| 一区二区三区av| 欧美va亚洲va国产综合| 久久一区中文字幕| 久久大综合网| 久久精品观看| 欧美一区二区三区在线看| 欧美四级剧情无删版影片| 亚洲福利免费| 亚洲毛片在线免费观看| 久久―日本道色综合久久| 久久久999| 久久久久久亚洲精品不卡4k岛国| 亚洲欧美日韩成人高清在线一区| 亚洲综合首页| 欧美乱大交xxxxx| 欧美极品一区二区三区| 亚洲欧洲精品一区二区| 日韩视频欧美视频| 亚洲美女色禁图| 免费91麻豆精品国产自产在线观看| 91久久极品少妇xxxxⅹ软件| 亚洲国产高清视频| 亚洲欧洲日产国码二区| 女女同性精品视频| 免费日韩成人| 一区二区三区在线观看视频| 性色一区二区三区| 久久久欧美一区二区| 久久综合伊人| 亚洲欧洲日产国码二区| 日韩一区二区精品视频| 亚洲视频在线一区| 午夜一区不卡| 国产伦精品一区二区三区| 亚洲免费在线看| 久久精品国产99国产精品| 理论片一区二区在线| 久久精品主播| 亚洲国产精品va在看黑人| 日韩午夜中文字幕| 亚洲自拍电影| 久久精品国产亚洲一区二区三区| 中国女人久久久| 午夜视频一区| 久久久久久噜噜噜久久久精品| 欧美综合国产| 久久五月激情| 亚洲区第一页| 欧美在线关看| 亚洲国产91精品在线观看| 中文欧美在线视频| 国产一区在线观看视频| 欧美电影免费观看高清完整版 | 久久久中精品2020中文| 国产麻豆精品theporn| 伊人久久成人| 国产精品久久久久久影视| 伊人春色精品| 亚洲欧美日韩视频一区| 伊人久久男人天堂| 欧美日韩免费观看中文| 国产一区二区三区四区| 欧美日韩第一区| 亚洲福利在线观看| 欧美三级欧美一级| 亚洲精品美女在线观看播放| 国产精品一区二区三区观看| 日韩亚洲国产欧美|