c++标准库——pair和tuple

/*
 * main.cpp
 *
 *  Created on: 2015年1月2日
 *      Author: star
 */
#include <iostream>
#include <string>
#include <utility> // pair
#include <tuple>
#include <typeinfo>
#include <type_traits>
#include <functional> //ref
using namespace std;
template<class T,class U>
ostream& operator << (ostream& os, const pair<T,U>& t){
    return os <<"["<< std::get<0>(t) <<","<< std::get<1>(t) <<"]"<<endl;
}
//tuple ,由于模板函数不支持偏特化,故以模板类封装函数来实现
template<int IDX,int MAX,typename... Args>
struct print_tuple{
    static void print(std::ostream& os,tuple<Args...>& t){
        if(IDX < MAX){
        os << std::get<IDX>(t)<<((IDX+1) == MAX? "":",");
        print_tuple<IDX+1,MAX,Args...>::print(os,t);
        }else{
            return;
        }
    }
};

template < int max,typename... args>
struct print_tuple<max,max,args...>{
    static void print(ostream& os,tuple<args...>& t){

    }
};
template <typename... args>
ostream& operator << (ostream& os ,tuple<args...>& t){
    os << "[";
    print_tuple<0,sizeof...(args),args...>::print(os,t);
    return os<<"]"<<endl;
}

//pair
int main() {
    pair<int, float> t = { 2, 2.5 };
    pair<char, int> t1('a', 23);
    auto t2 = make_pair(23, 'c');
    cout << t << t1 << t2;

    auto p = make_tuple(34, 4, 3, 4, 4, 4, "fdf", 345678987654323);
    tuple<int, double, char> p1(43, .33, 'c');
    // tuple <int,double,char> p2 ={34,.33,'e'};
    tuple<int, double, char> p3 { 3454, .243, 'e' };

    cout << p;
    /*
     *
     * tuple_size<tupltype>(),适用于tuple,pair,可以求元组的个数,当然pair永远是2
     * tuple_element<idx,tupletype>(),适用于tuple,pair,可以求元组的类型,第一个是序号,第二个是
     */

    cout << tuple_size<decltype(p)>::value << endl;
     tuple_element<0, decltype(p)>::type df;
    cout << typeid(df).name();
    /*
     * get<num>()
     * 适用于tuple,pair,num指元组中次序,当然pair只能小于2,其从0开始。最大为tuple_size()-1
     * 当然对于pair,我们还有first ,second
     */
    cout << get<0>(p) << get<5>(p) << endl;
    cout << get<0>(t) << get<1>(t) << endl;

    /*
     * make_pair(),make_tuple()
     * 可以传入引用,即可在外更改。
     */

    int refs = 33;
    char refchar = 'c';
    float reff = 4.44;
    auto refpair = make_pair(ref(refs), ref(refchar));
    cout << refpair;
    auto reftuple = make_tuple(ref(refs), ref(refchar), ref(reff));
    cout << reftuple;
    refs = 555;
    refchar = 'e';
    reff = 5.5556;
    cout << refpair;
    cout << reftuple;
    /*
     * 获取元组中的值的方式,另一种方式
     * tie(ref1,ref2,...)
     * 可用于pair ,tuple中的,
     * tie的作用是从元组获得值存入要绑定的值。
     * 如某个值不需要获取,则以std::ignore标记即可
     * 其需要明确元组中数的个数。
     * tie 返回一个tuple
     */

    char c ='t';
    auto tiepair = make_pair('e','e');
    tie(std::ignore,c) = tiepair;
    cout<< c<< endl;

    tuple<int,float,std::string> tf(33,1.33,"more light");
    int i;
    float f;
    string s;
    std::tie(i,f,s) = tf;
    cout << i <<":"<<f<<":"<<s<<endl;

    /*
     * tuple_cast(...)
     * 可以把传入的tuple或pair类型拼成一个tuple,需要注意的若是一个元素,tie也是可以返回的。
     */
    int dd = 667;
    auto tt = std::tuple_cat(make_tuple(31,334,'f',"fda"),make_pair(3456,44),make_tuple(dd),tie(dd));
    cout << tt;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值