C++ initializer_list 詳解

2021-02-19 CPP開發者

(給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++開發者專屬圈子

↓↓↓

點讚和在看就是最大的支持❤️

相關焦點

  • 跟我學C++中級篇——STL中的字符串
    +》和網上c++大牛陳碩的相關資料完善的。public:    basic_string(initializer_list<_Elem> _Ilist, const _Alloc& _Al = allocator_type())        : _Mypair(_One_then_variadic_args_t{}, _Al) {        auto&& _Alproxy
  • C++ 列表初始化詳解
    初始化列表在上面的使得一個類成為非聚合類的例子2、3、4中,這些非法的用法編譯器都報出的錯誤是cannot convert from 'initializer-list' to 'Foo',那麼這個initializer-list是什麼呢?為什麼使用列表初始化方法是將initializer-list轉換成對應的類類型呢?
  • python+C、C++混合編程的應用
    有的語言專注於簡單高效,比如python,內建的list,dict結構比c/c++易用太多,但同樣為了安全、易用,語言也犧牲了部分性能。在有些領域,比如通信,性能很關鍵,但並不意味這個領域的coder只能苦苦掙扎於c/c++的陷阱中,比如可以使用多種語言混合編程。
  • 深入了解C++(6):auto與函數模板之推導規則辨析
    {}在C++11中,有兩種身份:統⼀初始化(uniform initialization)的標誌std::initializer_list類的的標誌在C++11後,如果你想定義一個int類型變量int_num,並使用{1}來對int_num進行初始化。
  • 跟我學C++中級篇——STL的學習
    一、c++標準庫C++的標準庫主要包含兩大類,首先是包含C的標準庫的,當然,為了適應c++對一些C庫進行了少許的修改和增加。最重要的當然是面向對象的c++庫;而c++庫又可以分成兩大類,即面向對象的c++庫和標準模板庫,也就是題目中的STL。
  • json for modern c++的使用
    json for modern c++是一款非常好用的json庫,具有語法直觀和使用簡單的特點,並且是用C++11標準編寫的,此外還支持STL和json容器之間的轉換,可謂集方便又強大。本文推薦給廣大C++程式設計師,相信學習完本文之後,在處理json時一定會得心應手。
  • C++ 優先隊列priority_queue
    Container 必須是序列容器,其實C++中序列容器很多的,比如std::array、std::vector、std::deque、std::list等3.+/datastruct$ g++ priorityqueue.cpp -o commonsort -std=c++11albert@home-pc:/mnt/c++/datastruct$ .
  • C語言與C++面試知識總結
    成員初始化列表 好處常量成員,因為常量只能初始化不能賦值,所以必須放在初始化列表裡面引用類型,引用必須在定義的時候初始化,並且不能重新賦值,所以也要寫在初始化列表裡面沒有默認構造函數的類類型,因為使用初始化列表可以不必調用默認構造函數來初始化initializer_list 列表初始化
  • C++ vector詳解
    以下是正文前言本文mark了vector的一些接口,介紹了vector中的對內存和對象的管理詳解請見cppreference-vector。gt; fourth (third); int myints[] = {16,2,77,29}; std::vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );列表初始化可以使用c++
  • 擴展之Tensorflow2.0 | 21 Keras的API詳解(上)卷積、激活、初始化、正則
    28, 28, 2)現在來看參數含義:filter: 一個int整數,輸出特徵圖的通道數;kernel_size:一個int整數,卷積核大小;strides:一個整數或者是(a,b)這樣的list>    activity_regularizer=None,    depthwise_constraint=None,    pointwise_constraint=None,    bias_constraint=None,    **kwargs)參數詳解:
  • C++語言中std::array的神奇用法總結
    當前主流的g++版本已經能支持C++17標準,但是很多版本(如gcc 7.3)的C++17特性不是默認打開的,需要手工添加編譯選項-std=c++17。Equals定義了兩個版本,這是被C++的一個限制所逼的迫不得已:C++禁止{...}這種std::initializer_list字面量被推導為模板參數類型,因此我們必須提供一個版本聲明參數類型為數組,以便{1, 2, 3, 4}這種表達式能作為參數傳進去。
  • C++11學習 - Array的用法與vector用法
    class InputIterator>iterator insert (const_iterator position, InputIterator first, InputIterator last);move (4) iterator insert (const_iterator position, value_type&& val);initializer
  • C++數組詳解
    For example:大括號中的值的個數應該不大於數組定義的個數(如下圖所示,編繹錯誤Too many initializers for int[5])。上面的例子中有5個元素的數組foo,大括號裡有5個整數,如果小於5個也是可以的。
  • C/C++可變參數函數
    c/c++支持可變參數的函數,即函數的參數是不確定的。一、為什麼要使用可變參數的函數?一般我們編程的時候,函數中形式參數的數目通常是確定的,在調用時要依次給出與形式參數對應的所有實際參數。二、c/c++如何實現可變參數的函數?為了支持可變參數函數,C語言引入新的調用協議, 即C語言調用約定 __cdecl 。 採用C/C++語言編程的時候,默認使用這個調用約定。
  • 你一定用得到的免費C++資源集合
    www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2597.htmlThe C++ Resources Network地址:http://www.cplusplus.com/Draft C++ Standard: Contents地址:http://eel.is/c++
  • Apache基金會廢棄其C++標準庫
    該庫並沒有像GCC的libstdc++庫甚至是LLVM的libc++庫那樣被廣泛使用,自從2005年開始,Apache就開始支持stdcxx標準庫的開發。在2008年中旬,Apache發布了最後一個版本stdcxx 4.2.1。現在,Apache軟體基金會決定結束這個項目。
  • Redis 內部數據結構詳解(4):ziplist
    如有好文章投稿,請點擊 → 這裡了解詳情本系列基於 Redis 3.2 分支本文是《Redis內部數據結構詳解》系列的第四篇,介紹ziplist。什麼是ziplistRedis官方對於ziplist的定義是(出自ziplist.c的文件頭部注釋):The ziplist is a specially encoded dually linked list that is designed to be very memory efficient.
  • Python 列表(List)操作方法詳解
    如下所示:list1 = ['physics', 'chemistry', 1997, 2000];list2 = [1, 2, 3, 4, 5 ];list3 = ["a", "b", "c", "d"];與字符串的索引一樣,列表索引從0開始。列表可以進行截取、組合等。
  • C++之標準庫的學習總結
    二、c++標準庫:1、標準庫的特性:2、C++編譯環境的組成:>3、C++標準庫預定義了很多常用的數據結構:-<bitset>        -<set>          -<cstdio>-<deque>         -<stack>        -<cstring>    -<li
  • 五萬字長文:C/C++ 面試知識總結
    initializer_list 列表初始化【C++11】用花括號初始化器列表列表初始化一個對象,其中對應構造函數接受一個 std::initializer_list 參數.initializer_list 使用#include <iostream>#include <vector>#include <initializer_list>template <class T>struct S {    std::vector<T> v;