在補CF周賽時發現dalao用了一個 tie函數和tuple類型,表示沒怎麼接觸,如今稍微學習記錄一下。ios
tuple
即元組,能夠理解爲pair的擴展,能夠用來將不一樣類型的元素存放在一塊兒,經常使用於函數的多返回值。函數
定義與初始化
tuple能夠使用初始化列表進行賦值。學習
tuple<int,double,string> t3 = {1, 2.0, "3"};
std::tie:
建立左值引用的 tuple
,或將 tuple 解包爲獨立對象code
含左值引用的 std::tuple 對象。對象
std::tie
可用於解包 std::pair ,由於 std::tuple 擁有從 pair 的轉換賦值:get
std::tie
能用於引入字典序比較到結構體,或解包 tuple :string
#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"; }
結果以下:it
Value was inserted successfully
std::tie會將變量的引用整合成一個tuple,從而實現批量賦值。io
int i; double d; string s; tie(i, d, s) = t3; cout << i << " " << d << " " << s << endl;
會輸出4 2 3
class
以下例子摘自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