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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM