c++中的工具(一):std::pair<class T1, class T2> - <utility>

c++中的函数语法,只能有一个返回值,不像python一样,可以把多个返回值包装到一个元组中,如下

(x,y) = get_postion(value)

C++在标准库中定义了工具类std::pair<class T1, class T2>,使C++可以通过相似的方法支持返回两个值。pair的源码类似于:

namespace std {
    template <class T1, class T2>
    struct pair{
        typedef T1 first_type;
        typedef T2 second_type;

        T1 first;
        T2 second;

        pair():first(T1(), second(T2())){

        }

        pair(const T1&a, const T2&b):first(a),second(b){

        }

        template<class U, class V>
        pair(const pair<U,V>&p):first(p.first), second(p.second){

        }
    };

    template<class T1, class T2>
    bool operator==(const pair<T1, T2> &x, const pair<T1, T2> &y)
    {
        return x.first == y.first && x.second == y.second;
    }

    template<class T1, class T2>
    bool operator< (const pair<T1, T2> &x, const pair<T1, T2> &y)
    {
        return x.first < y.first || (!(x.first < y.first) && (x.second < y.second));
    }
// > != 等类似

template
<class T1, class T2> pair<T1,T2> make_pair(const T1&_first, const T2&_second) { return pair<T1,T2>(_first, _second); } }

标准库中的std::pair<class T1, class T2>定义在头文件<utility>中。

std::pair<double, int> getPrice(double unit_price, int amount){
    return std::make_pair(unit_price, amount);
}

int main()
{
    std::pair<double, int> info;
    info = getPrice(3.5, 12);
    std::cout << info.first << ":" << info.second << endl;
}

 

在标准库中,容器map就用到了pair来保存自己的每一项。我们在访问map的元素时,可以通过pair类来访问key和value

#include <iostream>
#include <map>
#include <utility>

using namespace std;

int main()
{
    typedef map<string, float> StringFloatMap;
    StringFloatMap coll;

    coll["VAT"] = 0.15;
    coll["Pi"] = 3.1415;
    coll["an arbitrary number"] = 4983.223;
    coll["Null"] = 0;

    StringFloatMap::iterator pos;
    for(pos = coll.begin(); pos!=coll.end(); ++pos){
        cout << "key: \"" << pos->first << "\" "
             << "value: \"" << pos->second << "\" "<<endl;
    }
}
posted @ 2020-01-04 19:47  mindulmindul  阅读(412)  评论(0编辑  收藏  举报