c++primer筆記----泛型算法

  • 大多數(shù)算法在<algorithm>。泛型算法運(yùn)行在迭代器之上
auto result = find(vec.begin(), vec.end(), val);
int ia = [1, 2, 3];
int * result = find(begin(ia), end(ia));
  • 數(shù)組利用指針實(shí)現(xiàn)泛型算法
  • 只讀算法:find、countaccumulate, <numeric>里、equal
  • 迭代器參數(shù):有的算法讀取兩個(gè)序列進(jìn)行比較或轉(zhuǎn)換,只需要容器中元素可以進(jìn)行就行。所以vectorlist、intdouble都可以的
  • 寫(xiě)容器元素的算法:不做安全性檢查、back_inserter可以改變?nèi)萜鞔笮?,通過(guò)它賦值,就是插入、拷貝算法
vector <int> vec; 
auto it = back_inserter(vec);
*it = 42; 相當(dāng)于push_back()

int a1 = {1, 2, 3};
int a2[sizeof(a1)/sizeof(*a1)];
auto ret = copy(begin(a1), end(a1), a2);  //<iterator>中的begin()
  • 重排容器元素的算法
sort(words.begin(), words.end());
auto end_unique = unique(words.begin(), words.end());
words.erase(end_unique, words.end());  //算法不能對(duì)容器進(jìn)行操作
  • 定制操作
bool isShorter(const string &s1, const string &s2)
{
        return s1.size()<s2.size();
}
sort(words.begin(), words.end(), isShorter);

//如果想同等長(zhǎng)度下,按照字典順序
elimDups(words);
stable_sort(words.begin(), words.end(), isShorter);
  • lambda表達(dá)式:可能定義在函數(shù)的內(nèi)部,必須使用尾置返回來(lái)指定返回類型。
    [comture list一般為空,是lambda所在函數(shù)中定義的局部變量的列表] (parameter list) -> return type {function body}??梢允÷詤?shù)列表和返回類型。如果函數(shù)體包含除return之外的語(yǔ)句,且未指定返回類型,則是void
stable_sort(words.begin(), words.end(), [] (const string &a, const string &b)
{return a.size()<b.size()}     //長(zhǎng)度短的在前面,返回true的在前面
  • 一個(gè)lambda只有在其捕獲列表中捕獲一個(gè)它所在函數(shù)中的局部變量,才能在函數(shù)體中使用變量
auto wc = find_if(words.begin(), words.end(), [sz](const string &a) 
{ return a.size() >= sz; } );  //返回第一個(gè)長(zhǎng)度不小于sz的元素的迭代器
  • 捕獲列表只用于局部非static變量,lambda表達(dá)式可以直接使用局部static變量和它所在函數(shù)之外的聲明的變量
for_each(wc, words.end(), [] (const string &a) { cout << s << " ";});
  • 可以這樣理解,向函數(shù)傳遞一個(gè)lambda時(shí),同時(shí)定義了一個(gè)新類型和該類型的一個(gè)對(duì)象:傳遞的參數(shù)就是這個(gè)未命名的對(duì)象

  • 捕獲分為值捕獲和引用捕獲。當(dāng)使用引用方式捕獲一個(gè)變量時(shí),必須保證lambda在執(zhí)行時(shí)是存在的。[a] or [&a]

  • 值捕獲也可以改變捕獲的值,mutable

[v1] () mutable {return ++v1};
  • 隱式捕獲:[= or &]讓編譯器推斷捕獲列表
  • 混合捕獲:[=, &a]默認(rèn)的是值捕獲,引用捕獲需要顯示捕獲
  • 參數(shù)綁定:bind
//在<functional>
bool check_size(const string &s, string::size_type sz)
{
    return s.size() >= sz;
}
using std::placeholder::_1;
auto check6 = bind(check_size, _1, 6);  //表示check6(_1) -> check_size(_1, 6)

//bind的那些不是占位符的參數(shù)被拷貝到Bind返回的可調(diào)用對(duì)象中
//如果不能拷貝
ostream &print(ostream &os, const string &s, char c)
{
    return os << s << c;
}

bind(print, ref(os), _1, ' ');    //ref函數(shù)定義在<functional>,  cref
  • 插入迭代器:接受一個(gè)容器,生成一個(gè)迭代器,實(shí)現(xiàn)向給定容器添加元素
back_inserter : push_back
front_inserter : push_front
inserter : insert(it, val)
  • iostream迭代器:istream_iterator操作
istream_iterator<int> int_it(cin);  //從cin中讀取Int數(shù)據(jù)
istream_iterator<int> eof;  //尾后迭代器
while (in_iter != eof)
      vec.push_back(*in_iter++);

//或者從迭代器范圍構(gòu)造vec,當(dāng)關(guān)聯(lián)的流遇到文件尾或IO錯(cuò)誤,迭代器的值就是eof
vector<int> vec(in_iter, eof)

//使用算法操作流迭代器
cout << accumulate(in, eof, 0)
  • ostream_iterator的操作
ostream_iterator<int> out_iter(cout, " "); //在輸出每個(gè)int后,輸出" "
for(auto e :  vec)
    *out_iter++ = e;   //等價(jià)于 out_iter = e
cout << endl;

//或者調(diào)用copy , std::copy, <algorithm>
copy(vec.begin(), vec.end(), out_iter);
cout << endl;
  • 使用流迭代器處理類類型
istream_iterator<Sales_item> item_iter(cin), eof;    //類定義了 << 
ostream_iterator<Sales_item> out_iter(cout, "\n");  //類定義了 >>
  • 反向迭代器
vec.crbegin()  //++之后指向前一個(gè)元素

cr_test.base();   //裝換為正向迭代器
  • 迭代器類別:輸入迭代器,find、輸出迭代器,copy and ostream_iterator、前向迭代器,replace,可進(jìn)行同一個(gè)位置的多次讀寫(xiě)、雙向迭代器,list的迭代器、隨機(jī)訪問(wèn)迭代器,array, deque, string, vector的迭代器

  • 對(duì)于每個(gè)迭代器參數(shù)來(lái)說(shuō),其能力必須與規(guī)定的最小類別相當(dāng)

  • 算法命名規(guī)范

unique(beg, end);
unique(beg, end ,comp);   //使用重載形式傳遞一個(gè)謂詞

//_if
find(beg, end, val)
find(beg, end, pred)  //返回第一個(gè)令pred為真的元素

//拷貝與不拷貝
reverse(beg, end);
reverse_copy(beg, end, dest)
  • 特定容器的算法:是list和forward_list的成員函數(shù)算法,有的操作會(huì)改變?nèi)萜?/li>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,666評(píng)論 1 51
  • 2. C++標(biāo)準(zhǔn)庫(kù) 2.1 IO庫(kù) IO對(duì)象無(wú)拷貝或賦值,進(jìn)行IO操作的函數(shù)通常以引用方式傳遞和返回流。 IO庫(kù)條...
    王偵閱讀 1,595評(píng)論 0 0
  • 順序容器中只定義了添加刪除訪問(wèn)等簡(jiǎn)單操作,用戶更多的需求,只能通過(guò)泛型算法實(shí)現(xiàn)。此類算法稱之為"泛型"是因?yàn)樗鼈兛?..
    saviochen閱讀 1,161評(píng)論 0 4
  • 10.1 概述 #include //大部分算法定義 #include <numeric> //數(shù)值泛型算法 ...
    龍遁流閱讀 660評(píng)論 0 1
  • 把酒祝東風(fēng),且共從容,垂楊紫陌洛城東。總是當(dāng)時(shí)攜手處,游遍芳叢。聚散苦匆匆,此恨無(wú)窮。今年花勝去年紅??上髂昊ǜ?..
    MaxBay閱讀 336評(píng)論 0 0

友情鏈接更多精彩內(nèi)容