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

Impossible is nothing  
  愛過知情重醉過知酒濃   花開花謝終是空   緣份不停留像春風來又走   女人如花花似夢
公告
日歷
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
統計
  • 隨筆 - 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 笑笑生 閱讀(156) 評論(0)  編輯 收藏 引用
 
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>
            久久成人羞羞网站| 亚洲激情在线激情| 午夜免费日韩视频| 国产麻豆9l精品三级站| 久久电影一区| 久久久久久亚洲精品杨幂换脸| 国产一区欧美日韩| 欧美高清一区| 欧美日韩午夜剧场| 欧美中文在线观看国产| 久久精品国产一区二区电影| 亚洲欧洲综合| 这里只有精品丝袜| 国产一区香蕉久久| 欧美激情区在线播放| 欧美日韩中文字幕精品| 久久国产欧美日韩精品| 蜜桃av综合| 亚洲伊人一本大道中文字幕| 欧美一级视频精品观看| 亚洲精品一级| 亚洲欧美日韩在线一区| 亚洲国产欧美一区二区三区丁香婷| 国内自拍视频一区二区三区| 136国产福利精品导航网址应用| 欧美激情精品久久久久久蜜臀| 欧美女主播在线| 久久aⅴ国产欧美74aaa| 欧美国产日韩亚洲一区| 亚洲欧美在线观看| 美女黄色成人网| 欧美在线一二三区| 欧美激情网友自拍| 快射av在线播放一区| 欧美日在线观看| 欧美国产精品劲爆| 国产午夜精品视频免费不卡69堂| 亚洲国产欧美一区二区三区同亚洲 | 91久久极品少妇xxxxⅹ软件| 亚洲午夜av| 亚洲精品久久久久中文字幕欢迎你 | 亚洲一区二区三区在线看| 久久精品夜色噜噜亚洲a∨| 亚洲免费在线观看| 欧美国产在线电影| 欧美成人高清| 精品成人国产在线观看男人呻吟| 一区二区激情小说| 99国产麻豆精品| 老司机精品久久| 久久亚洲综合色| 国产视频综合在线| 亚洲欧美国产高清va在线播| 亚洲尤物视频在线| 欧美日韩和欧美的一区二区| 麻豆精品国产91久久久久久| 国产性色一区二区| 亚洲女优在线| 西西裸体人体做爰大胆久久久| 欧美日韩高清在线观看| 91久久久亚洲精品| 日韩午夜黄色| 欧美区二区三区| 亚洲精品欧美精品| 一区二区三区久久网| 欧美日韩国产欧美日美国产精品| 欧美激情成人在线视频| 亚洲第一在线综合网站| 麻豆精品一区二区av白丝在线| 模特精品在线| 亚洲人成在线影院| 欧美人与禽猛交乱配| 亚洲伦理在线观看| 亚洲一区不卡| 国产麻豆视频精品| 久久精品毛片| 亚洲第一久久影院| 夜夜嗨av一区二区三区| 欧美日韩午夜剧场| 亚洲欧美日韩国产综合精品二区| 欧美在线亚洲在线| 亚洲福利精品| 欧美女人交a| 亚洲欧美日韩国产综合在线 | 欧美激情第一页xxx| 欧美激情第1页| 国产一区二区三区四区老人| 久久久久久**毛片大全| 欧美成人a视频| 这里只有精品丝袜| 国产欧美婷婷中文| 麻豆成人在线播放| 亚洲综合社区| 美女任你摸久久| 99热精品在线| 国产一区二区日韩精品| 麻豆精品一区二区综合av| 一本色道久久综合狠狠躁的推荐| 久久国产日本精品| 亚洲毛片一区二区| 国产日韩一区二区| 欧美激情一区二区| 欧美影院午夜播放| 99精品欧美一区二区三区| 久久久国产精品一区| 一本久道综合久久精品| 国产一区二区精品在线观看| 欧美激情第8页| 久久九九国产精品| 亚洲视频网在线直播| 欧美激情国产高清| 久久精品30| 在线中文字幕一区| 亚洲国产精彩中文乱码av在线播放| 欧美日韩色一区| 久久久久一区| 亚洲私拍自拍| 91久久在线| 欧美成人日韩| 久久国产精品久久久久久电车| 中文国产成人精品久久一| 亚洲激情成人在线| 在线 亚洲欧美在线综合一区| 国产精品久久久| 欧美日韩不卡视频| 免费一区视频| 久久午夜视频| 欧美在线播放高清精品| 亚洲一区二区在线| 一二三区精品福利视频| 亚洲肉体裸体xxxx137| 欧美高清不卡| 欧美激情中文字幕一区二区| 久久人人爽国产| 久久九九精品99国产精品| 亚洲欧洲99久久| 午夜视频在线观看一区二区三区 | 欧美精品在线一区二区三区| 美女免费视频一区| 老鸭窝毛片一区二区三区| 久久久久久精| 久久午夜精品一区二区| 久久久人成影片一区二区三区观看 | 亚洲高清不卡在线| 美日韩精品免费| 欧美+日本+国产+在线a∨观看| 久久天天躁狠狠躁夜夜av| 麻豆成人在线播放| 噜噜噜噜噜久久久久久91| 欧美福利视频| 亚洲国产日韩欧美在线图片| 亚洲国产精品一区二区尤物区| 亚洲福利视频在线| 亚洲人成在线观看网站高清| 91久久亚洲| 亚洲午夜女主播在线直播| 欧美一区二区福利在线| 欧美一区二区高清在线观看| 久久aⅴ国产欧美74aaa| 久久一区二区三区四区| 你懂的国产精品| 亚洲人成啪啪网站| 亚洲午夜在线视频| 久久精品av麻豆的观看方式 | 亚洲精品免费一区二区三区| 亚洲人成在线影院| 亚洲少妇最新在线视频| 欧美一区二区三区视频免费| 免费国产自线拍一欧美视频| 欧美日韩国产一中文字不卡| 国产精品狠色婷| 国产一区二区三区在线播放免费观看| 影音先锋在线一区| 一本久久a久久精品亚洲| 久久av一区| 91久久国产综合久久蜜月精品| 亚洲视频欧美视频| 久久婷婷麻豆| 国产精品wwwwww| 亚洲国产日韩欧美| 午夜精品久久久久久| 欧美成人精品| 亚洲影院色无极综合| 久久久久久久综合| 国产精品成人av性教育| 影音先锋亚洲视频| 欧美一级视频| 91久久午夜| 久热这里只精品99re8久| 欧美色另类天堂2015| 亚洲国产欧美日韩精品| 久久激情综合| 中文av一区特黄| 欧美成人资源| 狠狠久久婷婷| 欧美制服第一页| 一本色道精品久久一区二区三区| 老牛国产精品一区的观看方式| 国产精品网曝门| 中日韩美女免费视频网址在线观看|