函數原型
C++中std::tie函數的作用就是從元素引用中生成一個tuple元組,其在頭文件中定義,其函數原型如下:
template< class... Types >
std::tuple< Types&... > tie( Types&... args ) noexcept; //C++11起, C++14前
template< class... Types >
constexpr std::tuple< Types&... > tie( Types&... args ) noexcept;//C++14起
其中參數 args 為構造 tuple 所用的零或更多左值參數。其返回值為含的std::tuple對象。
作用和用法
1. 解包 tuple 和 pair
std::tie 可以用于解包 tuple 和 pair,因為 std::tuple 擁有從 pair 的轉換賦值。
注:元組tuple可以將不同類型的元素存放在一起,可以理解為pair的擴展(pair只能包含兩個元素,而tuple可以多個)。
std::tuple擁有從 pair 的轉換賦值的主要原因就是:tuple的實現中重載了 operator=,其部分原型如下:
template< class U1, class U2 > tuple& operator=( const std::pair< U1, U2 >& p );//C++11 起, C++20 前
因此,std::tie可以用于pair的解包:
std::set< int > set;
std::set< int >::iterator iter;
bool result;
std::tie(iter, result) = set.insert(value);//解包 insert 的返回值為 iter 與 result
std::tie(std::ignore, result) = set.insert(value);//使用std::ignore忽略insert的返回pair中的第一個元素
注 :std::ignore 是令 std::tie 在解包 std::tuple 時作為不使用的參數的占位符使用,即忽略某些 tuple 中的某些返回值。
2. 批量賦值
std::tie 可以將多個變量的引用整合成一個 tuple,進而通過另外一個同類型的 tuple 進行批量賦值。
tuple< string, double, int > tup("idoit", 98.8, 1);
string name;
double score;
int rank;
//通過變量tup實現對name、score、rank的批量賦值操作
tie(name, score, rank) = tup;
3. 比較結構體
可以將結構體成員傳入std::tie,從而實現結構體的比較。
struct S {
int n;
std::string s;
float d;
bool operator< (const S& rhs) const
{
// 比較 n 與 rhs.n,
// 然后為 s 與 rhs.s,
// 然后為 d 與 rhs.d
return std::tie(n, s, d) < std::tie(rhs.n, rhs.s, rhs.d);
//注:由于tie返回的是一個 tuple,tuple的實現已經重載了operator< ,因此可以利用tuple的operator< ,進而實現結構體S的operator< 。
}
};
具體示例
#include < iostream >
#include < set >
#include < string >
#include < tuple >
using namespace std;
struct S {
int n;
string s;
float d;
bool operator< (const S& rhs) const {
// 比較 n 與 rhs.n,
// 然后為 s 與 rhs.s,
// 然后為 d 與 rhs.d
return tie(n, s, d) < tie(rhs.n, rhs.s, rhs.d);
}
};
int main() {
set< S > set_of_s;
S value1{42, "Test1", 3.14};
S value2{23, "Test2", 3.14};
set< S >::iterator iter;
bool result;
/************解包**********/
tie(iter, result) = set_of_s.insert(value1);
if (result) cout < < "Value1 was inserted successfullyn";
tie(std::ignore, result) = set_of_s.insert(
value2); // 使用std::ignore忽略insert的返回pair中的第一個元素
if (result) cout < < "Value2 was inserted successfullyn";
/***********結構體比較**********/
bool r = value1 < value2;
cout < < "value1 < value2 : " < < r < < endl;
/***********批量賦值**********/
tuple< string, double, int > tup("idoit", 98.8, 1);
string name;
double score;
int rank;
tie(name, score, rank) = tup;
cout < < name < < " " < < score < < " " < < rank < < endl;
return 0;
}
輸出結果:
Value1 was inserted successfully
Value2 was inserted successfully
value1 < value2 : 0
idoit 98.8 1
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
轉換器
+關注
關注
27文章
9418瀏覽量
156327 -
C++語言
+關注
關注
0文章
147瀏覽量
7682
發布評論請先 登錄
相關推薦
熱點推薦
C++虛函數virtual詳解
C++ 中的虛函數用于解決動態多態問題,虛函數的作用是允許在派生類中重新定義與積累同名的函數,并且可以通過基類指針或引用來訪問基類和派生類中
發表于 09-07 11:27
?3367次閱讀
c++中冒號(:)和雙冒號(::)的用法
()——————————————————————————————————————VC中如下::是C++里的“作用域分解運算符”。比如聲明了一個類A,類A里聲明了一個成員函數voidf(),但沒有在類的聲明里給出f的定義,那么在類
發表于 10-18 10:08
如何在中斷C函數中調用C++
之前,我們在單片機程序開發時都會面對中斷函數。眾所周知的,這個中斷函數肯定是要用C函數來定義的。我在用C++進行程序開發的時候就發現了一個需
發表于 05-09 18:17
?0次下載
C++基礎知識之函數1
函數是 C++ 中的一個重要概念,它可以讓我們將一段代碼封裝起來,然后在需要的時候調用它。C++ 中的函數有以下幾個特點:
* 函數可
動態數組和C++ std::vector詳解
std::vector是C++的默認動態數組,其與array最大的區別在于vector的數組是動態的,即其大小可以在運行時更改。std::vector是封裝動態數組的順序容器,且該容器中元素的存取是連續的。
ostream在c++中的用法
ostream 是 C++ 標準庫中一個非常重要的類,它位于 頭文件中(實際上,更常見的是通過包含 頭文件來間接包含 ,因為 包含了 和 )。 ostream 類及其派生類(如 std::cout
C++ std::tie函數的作用和用法
評論