tuple元組是乙個固定大小不同型別的值的集合,是泛化的std::pair。我們也可以把它當作乙個通用的結構體來使用,不需要建立結構體有獲取結構體特徵,在某些情況可以取代結構體,使程式更簡潔、直觀。
tuple在c++11中使用簡單,但是往往要和模板元的一些技巧結合使用。
tuplechar *, int> tp = make_tuple("hello
", 5); //
構造乙個tuple
這個tuple等同於結構體:
structa;
另外一種方法也可以建立元組:std::tie,它會建立乙個元組的左值引用。
auto tp = return std::tie(1, "aa", 3); //
tp的實際型別是std::tuple
再看如何取值:
constchar *data = tp.get
<0>();
int len = tp.get
<1>();
還有std::tie也可以解包tuple來獲取元組的值:
intx, 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...