日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ initializer_list 类型详解

發(fā)布時間:2024/4/18 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ initializer_list 类型详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

initializer_list是C++11提供的新類型,定義在頭文件中。
用于表示某種特定類型的值的數(shù)組,和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}; //錯誤:轉換未執(zhí)行,因為存在丟失信息的風險
int c(ld),d=ld;?? //正確:轉換執(zhí)行,且確實丟失了部分值

??? 1
??? 2
??? 3

列表初始化就談到這里,接下來介紹initializer_list的使用
它提供的操作如下:

initializer_list<T> lst;
//默認初始化;T類型元素的空列表
initializer_list<T> lst{a,b,c...};
//lst的元素數(shù)量和初始值一樣多;lst的元素是對應初始值的副本
lst2(lst)? ?
lst2=lst ?
//拷貝或賦值一個initializer_list對象不會拷貝列表中的元素;拷貝后,原始列表和副本元素共享
lst.size()? //列表中的元素數(shù)量
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

而現(xiàn)在c++11添加了initializer_list后,我們可以這樣初始化

std::vector v = { 1, 2, 3, 4 };

??? 1

并且,C++11允許構造函數(shù)和其他函數(shù)把初始化列表當做參數(shù)。

#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.」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權協(xié)議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/fengxinlinux/article/details/72614874

總結

以上是生活随笔為你收集整理的C++ initializer_list 类型详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。