chapter-17

// chapter-17.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)葵擎。
//

#include "stdafx.h"
#include<iostream>
#include<tuple>
#include<vector>
#include<string>
#include<bitset>
#include<regex>
#include<random>
#include<ctime>
#include<cmath>

using namespace std;
using namespace std::regex_constants;       //regex的匹配標(biāo)志命名空間

vector<unsigned> good_value()
{
    static default_random_engine e;
    static uniform_int_distribution<unsigned> u(0, 9);
    vector<unsigned> ret;
    for (size_t i = 0; i < 10; ++i)
    {
        ret.push_back(u(e));
    }
    return ret;
}

int main()
{
    //tuple是一個(gè)快速而隨意的數(shù)據(jù)結(jié)構(gòu)况脆,其構(gòu)造函數(shù)為explicit!實(shí)參和返回值都是字面值常量!
    tuple<size_t, size_t, size_t> threeD;
    tuple<string, vector<int>> someVal("aaa", { 1,2,3 });
    auto item = make_tuple("00123", 3,150.0);
    //訪問(wèn)成員,通過(guò)get<>()函數(shù)訪問(wèn)成員!
    auto book = get<0>(item);
    auto cnt = get<1>(item);
    get<2>(item) *= 0.8;
    //查詢tuple的類型
    using trans=decltype(item);
    size_t sz = tuple_size<trans>::value;               //成員數(shù)量
    tuple_element<1, trans>::type element_1 = get<1>(item); //獲取對(duì)應(yīng)成員的類型误阻!
    //tuple進(jìn)行關(guān)系和相等比較時(shí)碉输,必須成員數(shù)量相同边翼,且每隊(duì)成員可以使用==運(yùn)算符或者<運(yùn)算符齐遵!
    tuple<string, string> compare_one("a", "b");
    tuple<string, string> compare_two("a", "c");
    if (compare_one < compare_two)
        cout << "One < Two!" << endl;
    //tuple常用于函數(shù)返回多值否淤!返回索引和首尾迭代器酪刀!

    //bitset刮萌,具有固定大小傻粘,且不能改變克饶!
    bitset<32> bitvec(1u);          //構(gòu)造函數(shù)為constexpr琅锻,參數(shù)必須是字面值類型卦停!
    //初始化方法
    //bitset<n> b
    //bitset<n> b(u)                //b為unsigned long long值u的低n位拷貝,如果超出則高位置0恼蓬!
    //bitset<n> b(s,pos,m,zero,one) //b是從string的pos開(kāi)始的m個(gè)字符的拷貝惊完,string只能包含zero和one!
    //bitset<n> b(cp,pos,m,zero,one)
    bitset<13> bitval1(0xbeef);     //1111011101111         高位被丟棄
    bitset<20> bitval2(0xbeef);     //0000101 1111011101111 高位補(bǔ)0
    string str("1111111000000011001101");
    bitset<5> bitval3(str, 5, 4);   //01100
    bitset<5> bitval4("1100");      //01100
    cout << bitval1 << " " << bitval2 << " " << bitval3 << " " << bitval4 << endl;

    //bitset的操作
    //b.any()               b中是否存在置位的二進(jìn)制,返回bool
    //b.all()               b中所有都置位了嗎处硬?
    //b.none()              b中不存在置位的二進(jìn)制
    //b.cout()              b中置位的位數(shù)小槐,返回size_t
    //b.size()              一個(gè)constexpr函數(shù),返回?凿跳?件豌??控嗜?
    //b.test(pos)           若pos置位則返回true
    //b.set(pos,v)          將pos的位設(shè)置為bool值v茧彤,若無(wú)實(shí)參則將b中所有位置位
    //b.set()
    //b.reset(pos)          復(fù)位
    //b.reset()
    //b.flip(pos)           改變pos處的位狀態(tài)
    //b.flip()
    //b[pos]                訪問(wèn)b中pos處的位!
    //b.to_long()
    //b.to_ullong()
    //b.to_string(zero,one) zero和one的默認(rèn)值分別為0和1疆栏,用來(lái)表示b中的0和1曾掂!
    //os<<b                 將b中二進(jìn)制位打印承边!
    //is>>b

    //正則表達(dá)式
    //regex                 正則表達(dá)式的類
    //regex_match           將字符序列與正則表達(dá)式匹配
    //regex_search          尋找第一個(gè)與正則表達(dá)式匹配的序列
    //regex_replace         使用給定格式替換一個(gè)正則表達(dá)式
    //sregex_iterator       迭代器遭殉,調(diào)用regex_search來(lái)遍歷一個(gè)string
    //smatch                容器類,保存在string中的搜索結(jié)果.(cmatch,保存const char*的結(jié)果)
    //ssub_match            string中匹配的子表達(dá)式的結(jié)果
    //regex_search和regex_match的參數(shù)博助,返回bool。指出是否找到匹配
    //(seq,m,r,mft)     seq可以為string或者一對(duì)迭代器或者指向空字符結(jié)尾的字符串痹愚,m為一個(gè)match對(duì)象富岳,保存匹配結(jié)果;r為正則表達(dá)式拯腮;mft是一個(gè)可選的值窖式,影響匹配過(guò)程!
    //(seq,r,mft)
    string pattern("[^c]ei");
    pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*";
    regex r(pattern);
    smatch results;
    string test_str = "receipt freind theif receive";
    if (regex_search(test_str, results, r))
        cout << results.str() << endl;
    
    //regex的操作
    //regex r(re)       re可以使string动壤、字符范圍迭代器萝喘、指向空字符結(jié)尾的字符數(shù)組、字符指針和計(jì)數(shù)器等等琼懊;
    //regex r(re,f)     f指出對(duì)象如何被處理阁簸,默認(rèn)值為ECMAScript
    //r1=re             正則表達(dá)式拷貝,re可以為正則表達(dá)式或者string哼丈!
    //r1.assign(re,f)   同上
    //r.mark_count()    r中子表達(dá)式的數(shù)目
    //r.flags()         返回r的標(biāo)志集
    //icase 匹配時(shí)忽略大小寫    nosubs不保存匹配的子表達(dá)式        optimize執(zhí)行速度優(yōu)先于構(gòu)造速度     ECMAScript指定語(yǔ)法      basie       extended        awk     grep        egrep
    regex r_cpp("([[:alnum:]]+)\\.(cpp|cxx|cc)$", regex::icase);    //一個(gè)或多個(gè)字母或數(shù)字后接一個(gè).启妹,再接一個(gè)cpp或cxx或cc。
    
    //正則表達(dá)式在regex對(duì)象初始化時(shí)檢查錯(cuò)誤醉旦,標(biāo)準(zhǔn)庫(kù)定義了regex_error的異常類饶米,含有what和code成員函數(shù)!
    //使用正則表達(dá)式時(shí)车胡,應(yīng)該避免多次構(gòu)造regex對(duì)象和regex賦值檬输,特別應(yīng)該在循環(huán)外創(chuàng)建regex對(duì)象!
    //正則表達(dá)式輸入類型和輸出類型應(yīng)該一致匈棘;string--regex--smatch--ssub_match--sregex_iterator//const char*--regex--cmatch--csub_match--cregex--iterator

    //Regex的迭代器丧慈,包含*it、it->羹饰、++it伊滋、it++碳却、it1==it2、it1笑旺!=it2操作昼浦!
    for (sregex_iterator it(test_str.begin(), test_str.end(), r), end_it; it != end_it; ++it)       //test_str為要查找的string字符串!end_it為尾后迭代器筒主!
    {
        cout << it->str() << endl;
    }

    //smatch對(duì)象包含的操作
    //m.ready()             匹配成功返回true
    //m.size()              返回最近一次匹配的正則表達(dá)式中子表達(dá)式的數(shù)目
    //m.empty()             若m.size()為0关噪,則返回true
    //m.perfix()
    //m.suffix()
    //m.format()

    //m.length(n)           子表達(dá)式序列索引!
    //m.position(n)
    //m.str(n)
    //m[n]
    //m.begin(),m.end()
    for (sregex_iterator it(test_str.begin(), test_str.end(), r), end_it; it != end_it; ++it)       //test_str為要查找的string字符串乌妙!end_it為尾后迭代器使兔!
    {
        cout << it->prefix().str() << "=" << it->str() << "=" << it->suffix().str() << endl;        // it->prefix().str()  it->str()  it->suffix().str()    smatch對(duì)象!prefix返回一個(gè)ssub_match對(duì)象藤韵!
    }
    //regex r_cpp("([[:alnum:]]+)\\.(cpp|cxx|cc)$", regex::icase);正則表達(dá)式虐沥,包含2個(gè)子表達(dá)式,通過(guò)括號(hào)進(jìn)行分組泽艘!
    string filename = "foo.cpp";
    smatch result_cpp;
    if (regex_search(filename, result_cpp, r_cpp))
        cout << result_cpp.str(0) << "http://" << result_cpp.str(1) << "http://" << result_cpp.str(2) << endl;
    
    //ssub_match子匹配操作欲险,子表達(dá)式常用于驗(yàn)證數(shù)據(jù)!
    //matched       指出ssub_match是否匹配了
    //first         返回首尾迭代器
    //second
    //length()      返回匹配的子表達(dá)式的長(zhǎng)度
    //str()         返回對(duì)應(yīng)string
    //s=ssub        將ssub轉(zhuǎn)為string對(duì)象匹涮!

    //正則表達(dá)式替換操作regex_replace
    //m.format(dest,fmt,mft)                使用格式字符串fmt生成格式化輸出天试;dest表示迭代器
    //m.format(fmt,mft)                     mft為匹配標(biāo)志!

    //regex_replace(dest,seq,r,fmt,mft)~dest表示什么然低?
    //regex_replace(seq,r,fmt,mft)
    string info = "aaa (201) 555-2368 862-555-0123 (973)555.0130 2015550175";
    string phone = "(\\()?(\\d{3})(\\))?([-. ])?(\\d{3})([-. ])?(\\d{4})";
    regex r_phone(phone);
    smatch m_p;
    string fmt = "$2.$5.$7";        //輸出第2喜每、5、7子序列雳攘!
    string fmt2 = "$2.$5.$7 \\ ";
    cout << regex_replace(info, r_phone, fmt) << endl;
    cout << regex_replace(info, r_phone, fmt2,format_no_copy) << endl;//format_no_copy表示不輸出序列中未匹配的部分带兜!

    //隨機(jī)數(shù),頭文件random来农。引擎類鞋真,生成隨機(jī)unsigned整數(shù)序列;分布類型沃于,使用引擎返回服從特定概率分布的隨機(jī)數(shù)
    default_random_engine e;        //標(biāo)準(zhǔn)庫(kù)定義了多個(gè)隨機(jī)數(shù)引擎類型涩咖!
    for (size_t i = 0; i < 10; ++i)
    {
        cout << e() << " ";
    }
    cout << endl;
    //隨機(jī)數(shù)引擎的操作
    //Engine e;             創(chuàng)建該引擎類型的對(duì)象
    //Engine e(s);          使用整數(shù)值s作為種子
    //e.seed(s)             使用種子s重置引擎狀態(tài)
    //e.min()               此引擎可生成的最大最小值
    //e.max()
    //Engine::result_type   此引擎生成的類型
    //e.discard(u)          將引擎推進(jìn)u步,u為unsigned long long

    //引擎和均布的組合==隨機(jī)數(shù)發(fā)生器
    uniform_int_distribution<unsigned> u(0, 9);         //均勻分布unsigned值
    default_random_engine e2;
    for (size_t i = 0; i < 10; ++i)
    {
        cout << u(e2) << " " ;
    }
    cout << endl;

    //一個(gè)給定的隨機(jī)數(shù)發(fā)生器會(huì)生器會(huì)一直生成相同隨機(jī)數(shù)序列繁莹。解決:1檩互、聲明static;2咨演、使用隨機(jī)數(shù)種子time(0)
    auto r1 = good_value();
    auto r2 = good_value();
    if (r1 != r2)
        cout << "R1 != R2" << endl;
    default_random_engine e3(time(0));          //time以秒計(jì)時(shí)闸昨,適用于生成種子時(shí)間間隔大于秒級(jí)!

    //生成隨機(jī)實(shí)數(shù)
    uniform_real_distribution<double> rd(0, 1);
    for (size_t i = 0; i < 10; ++i)
    {
        cout << rd(e3) << " ";
    }
    //生成非均勻分布的隨機(jī)數(shù),以正態(tài)分布為例
    normal_distribution<> n(4, 1.5);
    vector<unsigned> vals(9);
    for (size_t i = 0; i != 200; ++i)
    {
        unsigned v = lround(n(e));      //lround四舍五入到最接近的整數(shù)饵较!拍嵌,統(tǒng)計(jì)0~8的個(gè)數(shù)!
        if (v < vals.size())
            ++vals[v];
    }
    for (size_t j = 0; j != vals.size(); ++j)
    {
        cout << j << ": " << string(vals[j], '*') << endl;
    }
    //生成bool值
    bernoulli_distribution bb(0.8);     //增加true的勝率循诉!0.8横辆!
    bool b_one = bb(e3);
    if (b_one)
        cout << "One!" << endl;

    //IO未看!

    system("pause");
    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茄猫,一起剝皮案震驚了整個(gè)濱河市狈蚤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌划纽,老刑警劉巖脆侮,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異勇劣,居然都是意外死亡靖避,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門比默,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)筋蓖,“玉大人,你說(shuō)我怎么就攤上這事退敦。” “怎么了蚣抗?”我有些...
    開(kāi)封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵侈百,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我翰铡,道長(zhǎng)钝域,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任锭魔,我火速辦了婚禮例证,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘迷捧。我一直安慰自己织咧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布漠秋。 她就那樣靜靜地躺著笙蒙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪庆锦。 梳的紋絲不亂的頭發(fā)上捅位,一...
    開(kāi)封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼艇搀。 笑死尿扯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的焰雕。 我是一名探鬼主播衷笋,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼淀散!你這毒婦竟也來(lái)了右莱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤档插,失蹤者是張志新(化名)和其女友劉穎慢蜓,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體郭膛,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晨抡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了则剃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耘柱。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖棍现,靈堂內(nèi)的尸體忽然破棺而出调煎,到底是詐尸還是另有隱情,我是刑警寧澤己肮,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布士袄,位于F島的核電站,受9級(jí)特大地震影響谎僻,放射性物質(zhì)發(fā)生泄漏娄柳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一艘绍、第九天 我趴在偏房一處隱蔽的房頂上張望赤拒。 院中可真熱鬧,春花似錦诱鞠、人聲如沸挎挖。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肋乍。三九已至,卻和暖如春敷存,著一層夾襖步出監(jiān)牢的瞬間墓造,已是汗流浹背堪伍。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留觅闽,地道東北人帝雇。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛉拙,于是被迫代替她去往敵國(guó)和親尸闸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容