C11簡潔之道 tupe元祖

2022-05-07 00:51:08 字數 1429 閱讀 3687

tuple元組是乙個固定大小不同型別的值的集合,是泛化的std::pair。我們也可以把它當作乙個通用的結構體來使用,不需要建立結構體有獲取結構體特徵,在某些情況可以取代結構體,使程式更簡潔、直觀。

tuple在c++11中使用簡單,但是往往要和模板元的一些技巧結合使用。

tuplechar *, int> tp = make_tuple("

hello

", 5); //

構造乙個tuple

這個tuple等同於結構體:

struct

a;

另外一種方法也可以建立元組:std::tie,它會建立乙個元組的左值引用。

auto tp = return std::tie(1, "

aa", 3); //

tp的實際型別是std::tuple

再看如何取值:

const

char *data = tp.get

<0>();

int len = tp.get

<1>();

還有std::tie也可以解包tuple來獲取元組的值:

int

x, y;

string

s;std::tie(x, s, y) = tp;

通過tie解包之後,tp的三個元素會自動賦值給三個變數,如果只想解某個位置的值,可以使用std::ignore佔位符來表示忽略某個位置的值。

std::tie(std::ignore, std::ignore, y) = tp; //

只解第三個值

如果要建立右值引用的元組,可以使用foward_as_tuple。

std::mapmap; 

//建立乙個類似std::tuple的tuple

map.emplace(std::foward_as_tuple(10, std::string(20, '

a')));

還可以通過tuple_cat來連線多個tuple:

std::tuple t1(10, "

test

", 30.21

);int n = 7

;auto t2 = std::tuple_cat(t1, std::make_pair("

foo", "

bar"

), t1, std::tie(n));

n = 10;

列印t2的值:

10, test, 30.21,foo, bar, 10, test, 30.21, 10

tuple雖然可以替代簡單的結構體,但是如果三個以上欄位的結構體會導致可讀性降低,到處都是std::get(tuple),導致**混亂,可維護性和可讀性很低。

C11簡潔之道 迴圈的改善

在c 98 03中,通過for迴圈對乙個容器進行遍歷,一般有兩種方法,常規的for迴圈,或者使用中的for each方法。for迴圈遍歷 void func void for each方法 void vfunccall int n void func2 void for each相比一般的for迴圈...

(原創)用c 11實現簡潔的ScopeGuard

scopeguard的作用是確保資源面對異常時總能被成功釋放,就算沒有正常返回。慣用法讓我們在建構函式裡獲取資源,當因為異常或者正常作用域結束,那麼在析構函式裡釋放資源。總是能釋放資源。如果沒有異常丟擲則正常結束,只是有異常發生或者沒有正常退出時釋放資源。關於scopegaurd的概念想多了解一點的...

C11效能之道 標準庫優化

emplace back能通過引數構造物件,不需要拷貝或者移動記憶體,相比pusk back能更好的避免記憶體的拷貝和移動,使容器插入元素效能得到進一步提公升。幾乎所有的標準庫容器都增加了型別的方法 emplace,emplace hint,emplace front,emplace after和e...