5.1.1 Pair

  1. template <class _Ty1, class _Ty2>
  2. struct pair { // store a pair of values
  3. typedef pair<_Ty1, _Ty2> _Myt;
  4. typedef _Ty1 first_type;
  5. typedef _Ty2 second_type;
  6. ...
  7. };

操作函数

操作函数 影响
pair<T1, T2> p Default构造函数,建立一个pair,其元素类型分别为T1和T2,各自以其default构造函数初始化
pair<T1, T2> p(vall, vall) 建立一个pair,元素类型分别为T1和T2,以vall和vall为初值
pair<T1, T2> p(rv1, rv2) 建立一个pair,元素类型分别为T1和T2,以rv1和rv2进行搬移式初始化
pair<T1, T2> p ( piecewise_construct,t1, t2) 建立一个pair,元素类型分别为tuple T1和T2,以tuple t1和t2的元素为初值
pair<T1, T2> p(p2) Copy构造函数,建立p成为p2的拷贝
pair<T1, T2> p(rv) Move构造函数,将rv的内容移至p,允许隐式类型转换
p = p2 将p2赋值给p(始自C++11,允许隐式类型转换)
p = rv 将rv的值move assign给p(始自C++11,允许隐式类型转换)
p.first() 获得pair内的第一value(直接成员访问)
p.second() h获得pair内的第二value(直接成员访问)
get<0> (p) 等价于p.first()
get<1> (p) 等价于p.second()
p1 == p2 返回”是否p1等于p2”
(等价于p1.first==p2.first&&
p1 != p2 返回”是否p1不等于p2” ( !(p1==p2) )
p1 < p2 返回”是否p1小于p2”(比较first,如果相等则比较second)
p1 > p2 返回”是否p1大于p2”(比较first,如果相等则比较second)
p1 >= p2 返回”是否p1大于等于p2” ( !(p1<p2) )
p1 <= p2 返回”是否p1小于等于p2”( !(p1>p2) )
p1.swap(p2) 互换p1和p2的数据
swap(p1, p2) 互换p1和p2的数据
make_pair(val1, val2) 返回一个pair,带有val1和val2的类型和数值

例子1:将std::pair写入到stream流中

  1. template <typename T1, typename T2>
  2. std::ostream& operator<<(std::ostream& strm, const std::pair<T1, T2>& p)
  3. {
  4. return strm << "[" << p.first << ", " << p.second << "]";
  5. }

获取值、类型和大小

  • 获取值
    • 第一个元素:p.first
    • 第二个元素:p.second
  • 获取类型
    • 方法一:std::get<0>(p)
    • 方法二:tuple_element<1, pair<int, float>>::type
  • 获取大小
    • tuple_size<pair<int, float>>::value ```cpp

      include

      include

using namespace std;

int main(int argc, char* argv[]) { typedef std::pair IntFloatPari; IntFloatPari p(42, 3.14); // 获取值 cout << “获取值: “ << endl; cout << “ first value: “ << p.first << endl; cout << “ second value: “ << p.second << endl;

  1. // 获取类型
  2. cout << "获取类型: " << endl;
  3. cout << " 方式一: std::get<0>(p)" << endl;
  4. cout << " first type: " << std::get<0>(p) << endl;
  5. cout << " second type: " << std::get<1>(p) << endl;
  6. cout << " 方式二: tuple_element<0, IntFloatPari>::type" << endl;
  7. cout << " first type: " << typeid(tuple_element<0, IntFloatPari>::type).name() << endl;
  8. cout << " second type: " << typeid(tuple_element<1, IntFloatPari>::type).name() << endl;
  9. cout << "获取大小: " << endl;
  10. cout << " tuple_size: " << tuple_size<IntFloatPari>::value << endl;

}

/ 输出 获取值: first value: 42 second value: 3.14 获取类型: 方式一: std::get<0>(p) first type: 42 second type: 3.14 方式二: tuple_element<0, IntFloatPari>::type first type: int second type: float 获取大小: tuple_size: 2 / ``` 构造函数和赋值