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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

c++之 std::tie

發布時間:2024/3/12 c/c++ 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++之 std::tie 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

在c++ 11標準庫中,加入了std::tie,在c++ 14中改進,方便使用。 其與tuple關系密切, 主要目的是方便地使用tuple。

元組 std::tuple

元組tuple,有人認為是std::pair擴展。pair只能把2個數據打包,而tuple可以打包更多的數據,雖然超過了9個時,其方式就比較搞笑了。

template<class _Ty1,class _Ty2>struct pair{ // store a pair of valuestypedef pair<_Ty1, _Ty2> _Myt;typedef _Ty1 first_type;typedef _Ty2 second_type;pair(): first(), second(){ // default construct}pair(const _Ty1& _Val1, const _Ty2& _Val2): first(_Val1), second(_Val2){ // construct from specified values}template<class _Other1,class _Other2,class = typename enable_if<is_convertible<const _Other1&, _Ty1>::value&& is_convertible<const _Other2&, _Ty2>::value,void>::type>pair(const pair<_Other1, _Other2>& _Right): first(_Right.first), second(_Right.second){ // construct from compatible pair}//......

為生成pair, c++ 提供了make_pair的快捷操作。

而tuple的定義:

template<class _This,class... _Rest>class tuple<_This, _Rest...>: private tuple<_Rest...>{ // recursive tuple definition public:typedef _This _This_type;typedef tuple<_This, _Rest...> _Myt;typedef tuple<_Rest...> _Mybase;static const size_t _Mysize = 1 + sizeof...(_Rest);tuple(): _Mybase(),_Myfirst(){ // construct default}template<class... _Rest2>explicit tuple(_Tuple_alloc_t, _Rest2&&... _Rest_arg): _Mybase(_STD forward<_Rest2>(_Rest_arg)...),_Myfirst(allocator_arg){ // construct smuggled allocator_arg_t element}template<class... _Other,class = typename _Tuple_enable<tuple<const _Other&...>, _Myt>::type>tuple(const tuple<_Other...>& _Right): _Mybase(_Right._Get_rest()), _Myfirst(_Right._Myfirst._Val){ // construct by copying same size tuple}// ....

相應地,c++ 標準庫提供了make_tuple 內聯方法,快速創建tuple對象。

std::tie

一般std::tie有2個作用:

  • 創建一個std::tuple;
  • 解包標準庫中的一些集合類,簡化訪問方法。

生成tuple

使用極為簡單,可以使用構造函數,內聯快捷方法。
示例:

// 定義時 初始化 std::tuple<int, double, std::string> student1 = { 1, 98.0, "David" }; // 使用構造函數 std::tuple<int, double, std::string> student2 ( 2, 99.2, "david2" );

下面的示例使用內聯快捷方法。 這里還使用了新版本c++支持的類型auto , 讓編譯器自動判斷類型 – 雖然傳統的我并不喜歡-- 編譯時,編譯器要選擇至少支持C11版本. 如果使用VS,可以看到這些設置。


在linux/macOS上,在g++ build時,指定std, 如:

g++ tuple_sample.cpp -o tuple_sample -std=c++11

代碼示例:

auto student2 = std::make_tuple(11, 98, "Tom" );

使用std:tie,則也可以簡單處理:

string name3 = "david3"; int id3 = 3; double d3 = 99.3; tuple<int, double, string> student3 = std::tie(id3, d3, name3);

解包數據

使用std::tie 可以對一些集合類型進行解包,包括set, tuple, pair … 簡化數據訪問并賦值到變量。

如示例:

int id3; string name3; std::tie(id3, std::ignore, name3) = student3; cout << "tie student-" << id3 << " \t " << name3 << endl;

注意: 這里使用std:ignore跳過數據對象中不關心的數據。

輸出:

tie student-3 david3

總結

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

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