在補CF周賽時發現dalao用了一個 tie函數和tuple類型,表示沒怎么接觸,現在稍微學習記錄一下。
tuple 即元組,可以理解為pair的擴展,可以用來將不同類型的元素存放在一起,常用於函數的多返回值。
定義與初始化
tuple可以使用初始化列表進行賦值。
tuple<int,double,string> t3 = {1, 2.0, "3"};
std::tie: 創建左值引用的 tuple,或將 tuple 解包為獨立對象
返回值
含左值引用的 std::tuple 對象。
注意
std::tie 可用於解包 std::pair ,因為 std::tuple 擁有從 pair 的轉換賦值:
示例
std::tie 能用於引入字典序比較到結構體,或解包 tuple :
#include <iostream>
#include <set>
#include <string>
#include <tuple>
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);
}
};
int main() {
std::set<S> set_of_s; // S 為可比較小於 (LessThanComparable)
S value{42, "Test", 3.14};
std::set<S>::iterator iter;
bool inserted;
// 解包 insert 的返回值為 iter 與 inserted
std::tie(iter, inserted) = set_of_s.insert(value);
if (inserted)
std::cout << "Value was inserted successfully\n";
}
結果如下:
Value was inserted successfully
std::tie會將變量的引用整合成一個tuple,從而實現批量賦值。
int i;
double d;
string s;
tie(i, d, s) = t3;
cout << i << " " << d << " " << s << endl;
會輸出4 2 3
如下例子摘自http://www.cplusplus.com/reference/tuple/tie/
// packing/unpacking tuples
#include <iostream> // std::cout
#include <tuple> // std::tuple, std::make_tuple, std::tie
int main() {
int myint;
char mychar;
std::tuple<int, float, char> mytuple;
mytuple = std::make_tuple(10, 2.6, 'a'); // packing values into tuple
std::tie(myint, std::ignore, mychar) =
mytuple; // unpacking tuple into variables
std::cout << "myint contains: " << myint << '\n';
std::cout << "mychar contains: " << mychar << '\n';
return 0;
}
輸出:
myint contains: 10
mychar contains: a
std::ignore介紹:
任何值均可賦給而無效果的未指定類型的對象。目的是令 std::tie 在解包 std::tuple 時作為不使用的參數的占位符使用。
示例
解包 set.insert() 所返回的 pair ,但只保存布爾值。
#include <iostream>
#include <string>
#include <set>
#include <tuple>
int main()
{
std::set<std::string> set_of_str;
bool inserted = false;
std::tie(std::ignore, inserted) = set_of_str.insert("Test");
if (inserted) {
std::cout << "Value was inserted successfully\n";
}
}
結果如下:
Value was inserted successfully
