C++函數:std::tie 詳解

在補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 3class

以下例子摘自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
相關文章
相關標籤/搜索