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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C++11中std::initializer_list的使用

發布時間:2023/11/27 生活经验 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++11中std::initializer_list的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

initializer_list是一種標準庫類型,用于表示某種特定類型的值的數組。和vector一樣,initializer_list也是一種模板類型,定義initializer_list對象時,必須說明列表中所含元素的類型。和vector不一樣的是,initializer_list對象中的元素永遠是常量值,我們無法改變initializer_list對象中元素的值。

initializer_list可以作用于可變數量的實參:有時我們無法提前預知應該向函數傳遞幾個實參。為了編寫能處理不同數量實參的函數,C++11新標準提供了兩種主要的方法:如果所有的實參類型相同,可以傳遞一個名為initializer_list的標準庫類型;如果實參的類型不同,我們可以編寫一種特殊的函數,也就是所謂的可變參數模板。

作用于initializer_list對象的begin和end操作類似于vector對應的成員。begin()成員提供一個指向列表首元素的指針,end()成員提供一個指向列表尾元素的指針。

含有initializer_list形參的函數也可以同時擁有其他形參。

類模板initializer_list用于訪問初始化列表(initialization list),列表元素的數據類型為const T.編譯器從花括號(brace)封閉的、元素由逗號分隔開的初始化列表自動構造initializer_list模板類, 例如:

auto il = {10,20, 30}; // the type of il is an initializer_list<int>
類模板initializer_list引用(refer to)但不包含這個這個列表的元素。復制這個initializer_list對象將引用到同一個基礎列表而不是引用到基礎列表的新的拷貝。std::initializer_list并不是一個容器,不要用它傳遞期望長期存儲的值。構造函數的形參如果為一個initializer_list模板類,則這種特殊的構造函數稱為初始化器列表構造函數(initializer_list constructor),例如:

struct myclass {myclass (int,int);myclass (initializer_list<int>);/* definitions ... */
};
myclass foo {10,20};  // calls initializer_list constructor
myclass bar (10,20);  // calls first constructor 

僅可以從braced-init-list推導出initializer_list<T>。這一過程中,編譯器自動查詢哪些構造函數可以用initializer_list<T>作為參數,并據此確定initializer_list的模板參數T的類型,從而對braced-init-list做類型轉換。

C++11標準明確規定不能由模板參數推導出對應實參std::initializer_list的類型。

C++還有一種特殊的形參類型(即省略符),可以用它傳遞可變數量的實參。

省略符形參是為了便于C++程序訪問某些特殊的C代碼而設置的,這些代碼使用了名為varargs的C標準庫功能。通常,省略符形參不應用于其他目的。省略符形參只能出現在形參列表的最后一個位置。

? std::initializer_list:This type is used to access the values in a C++ initialization list, which is a list of elements of type const T.

下面是從其它文章中copy的std::initializer_list測試代碼,詳細內容介紹可以參考對應的reference:

#include "initializer_list.hpp"
#include <initializer_list>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>///
// reference: http://www.cplusplus.com/reference/initializer_list/initializer_list/
struct myclass {std::string str;myclass(std::initializer_list<int> args) {std::stringstream ss;std::initializer_list<int>::iterator it;  // same as: const int* itfor (it = args.begin(); it != args.end(); ++it) ss << ' ' << *it;str = ss.str();}
};template<class T>
struct simple_container {T * data;unsigned n;simple_container(std::initializer_list<int> args) {data = new T[args.size()];n = 0;for (T x : args) { data[n++] = x; }}T* begin() { return data; }T* end() { return data + n; }
};template<class T>
void print_list(std::initializer_list<T> il)
{for (const T* it = std::begin(il); it != std::end(il); ++it) std::cout << ' ' << *it;std::cout << '\n';
}int test_initializer_list_1()
{
{std::initializer_list<int> mylist;mylist = { 10, 20, 30 };std::cout << "mylist contains:";for (int x : mylist) std::cout << ' ' << x;std::cout << '\n';
}{myclass myobject{ 10, 20, 30 };std::cout << "myobject contains:" << myobject.str << '\n';
}{simple_container<int> myobject{ 10, 20, 30 };std::cout << "myobject contains:";for (int x : myobject) std::cout << ' ' << x;std::cout << '\n';
}{print_list({ 10, 20, 30 });
}{// 編譯器從花括號(brace)封閉的、元素由逗號分隔開的初始化列表自動構造initializer_list模板類auto il = { 10, 20, 30 };for (auto i : il)std::cout << i << "    ";std::cout << std::endl;
}return 0;
}// reference: http://en.cppreference.com/w/cpp/utility/initializer_list
template <class T>
struct S {std::vector<T> v;S(std::initializer_list<T> l) : v(l) {std::cout << "constructed with a " << l.size() << "-element list\n";}void append(std::initializer_list<T> l) {v.insert(v.end(), l.begin(), l.end());}std::pair<const T*, std::size_t> c_arr() const {return{ &v[0], v.size() };  // copy list-initialization in return statement// this is NOT a use of std::initializer_list}
};template <typename T>
void templated_fn(T) {}int test_initializer_list_2()
{S<int> s = { 1, 2, 3, 4, 5 }; // copy list-initializations.append({ 6, 7, 8 });      // list-initialization in function callstd::cout << "The vector size is now " << s.c_arr().second << " ints:\n";for (auto n : s.v)std::cout << n << ' ';std::cout << '\n';std::cout << "Range-for over brace-init-list: \n";for (int x : {-1, -2, -3}) // the rule for auto makes this ranged-for workstd::cout << x << ' ';std::cout << '\n';auto al = { 10, 11, 12 };   // special rule for autostd::cout << "The list bound to auto has size() = " << al.size() << '\n';//    templated_fn({1, 2, 3}); // compiler error! "{1, 2, 3}" is not an expression,// it has no type, and so T cannot be deducedtemplated_fn<std::initializer_list<int>>({ 1, 2, 3 }); // OKtemplated_fn<std::vector<int>>({ 1, 2, 3 });           // also OKreturn 0;
}

GitHub:? https://github.com/fengbingchun/Messy_Test

總結

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

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