C++ initializer_list 类型详解
initializer_list是C++11提供的新類型,定義在頭文件中。
用于表示某種特定類型的值的數組,和vector一樣,initializer_list也是一種模板類型。
template< class T >
class initializer_list;
??? 1
??? 2
要介紹initializer_list的使用,有必要先談一談列表初始化。
C++11擴大了初始化列表的適用范圍,使其可用于所有內置類型和用戶定義的類型。無論是初始化對象還是某些時候為對象賦新值,都可以使用這樣一組由花括號括起來的初始值了。使用初始化列表時,可添加=,也可不添加。
//定義一個變量并初始化
int units_sold=0;
int units_sold(0);
int units_sold={0};? //列表初始化
int units_sold{0};??? //列表初始化
??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
當初始化列表用于內置類型的變量時,這種初始化形式有一個重要特點:如果我們使用列表初始化值存在丟失信息的風險,則編譯器將報錯:
long double ld=3.1415926536;
int a={ld},b={ld}; //錯誤:轉換未執行,因為存在丟失信息的風險
int c(ld),d=ld;?? //正確:轉換執行,且確實丟失了部分值
??? 1
??? 2
??? 3
列表初始化就談到這里,接下來介紹initializer_list的使用
它提供的操作如下:
initializer_list<T> lst;
//默認初始化;T類型元素的空列表
initializer_list<T> lst{a,b,c...};
//lst的元素數量和初始值一樣多;lst的元素是對應初始值的副本
lst2(lst)? ?
lst2=lst ?
//拷貝或賦值一個initializer_list對象不會拷貝列表中的元素;拷貝后,原始列表和副本元素共享
lst.size()? //列表中的元素數量
lst.begin()? //返回指向lst中首元素的指針
lst.end()?? //返回指向lst中尾元素下一位置的指針
??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9
??? 10
需要注意的是,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;
}
??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
如果想向initializer_list形參中傳遞一個值的序列,則必須把序列放在一對花括號內:
//expected和actual是string對象
if(expected != actual)
?? error_msg({"functionX",expectde,actual});
else
?? error_msg({"functionX","okay"});
??? 1
??? 2
??? 3
??? 4
??? 5
說了這么多,那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);
??? 1
??? 2
??? 3
??? 4
??? 5
而現在c++11添加了initializer_list后,我們可以這樣初始化
std::vector v = { 1, 2, 3, 4 };
??? 1
并且,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();? // 1 2 3 4
??? return 0;
}
————————————————
版權聲明:本文為CSDN博主「Rotation.」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/fengxinlinux/article/details/72614874
總結
以上是生活随笔為你收集整理的C++ initializer_list 类型详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c __cplusplus详解
- 下一篇: C++:Static修饰变量 vs St