(給CPP開發者加星標,提升C/C++技能)
https://blog.csdn.net/fengxinlinux/article/details/72614874【導讀】:模板initializer_list是C++11中新增的,用於可讓我們列表初始化容器,自定義的函數,自定義的類中的構造函數,要在代碼中使用initializer_list必須包含頭文件initializer_list,這個模板很簡單,包含成員函數 begin(),end(),size(),可以使用這些函數去遍歷列表元素。
以下是正文
initializer_list是C++11提供的新類型,定義在頭文件中。
用於表示某種特定類型的值的數組,和vector一樣,initializer_list也是一種模板類型。
template< class T >class initializer_list;要介紹initializer_list的使用,有必要先談一談列表初始化。
C++11擴大了初始化列表的適用範圍,使其可用於所有內置類型和用戶定義的類型。無論是初始化對象還是某些時候為對象賦新值,都可以使用這樣一組由花括號括起來的初始值了。使用初始化列表時,可添加=,也可不添加。
int units_sold=0;int units_sold(0);int units_sold={0}; int units_sold{0};當初始化列表用於內置類型的變量時,這種初始化形式有一個重要特點:如果我們使用列表初始化值存在丟失信息的風險,則編譯器將報錯:
long double ld=3.1415926536;int a={ld},b={ld}; int c(ld),d=ld;列表初始化就談到這裡,接下來介紹initializer_list的使用
它提供的操作如下:initializer_list<T> lst; initializer_list<T> lst{a,b,c...};lst2(lst) lst2=lst lst.size() lst.begin() lst.end()需要注意的是,initializer_list對象中的元素永遠是常量值,我們無法改變initializer_list對象中元素的值。並且,拷貝或賦值一個initializer_list對象不會拷貝列表中的元素,其實只是引用而已,原始列表和副本共享元素。
和使用vector一樣,我們也可以使用迭代器訪問initializer_list裡的元素
void error_msg(initializer_list<string> il){ for(auto beg=il.begin();beg!=il.end();++beg) cout<<*beg<<" "; cout<<endl;}如果想向initializer_list形參中傳遞一個值的序列,則必須把序列放在一對花括號內:
if(expected != actual) error_msg({"functionX",expectde,actual});else error_msg({"functionX","okay"});說了這麼多,那initializer_list到底有什麼應用呢?
有了initializer_list之後,對於STL的container的初始化就方便多了,比如以前初始化一個vector需要這樣:
std::vector v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);而現在c++11添加了initializer_list後,我們可以這樣初始化
std::vector v = { 1, 2, 3, 4 };並且,C++11允許構造函數和其他函數把初始化列表當做參數。
#include <iostream>#include <vector>
class MyNumber{public: MyNumber(const std::initializer_list<int> &v) { for (auto itm : v) { mVec.push_back(itm); } }
void print() { for (auto itm : mVec) { std::cout << itm << " "; } }private: std::vector<int> mVec;};
int main(){ MyNumber m = { 1, 2, 3, 4 }; m.print();
return 0;}- EOF -
關於 C++ initializer_list 詳解,歡迎在評論中和我探討。覺得文章不錯,請點讚和在看支持我繼續分享好文。謝謝!
關注『CPP開發者』
看精選C++技術文章 . 加C++開發者專屬圈子
↓↓↓
點讚和在看就是最大的支持❤️