pair在底层被定义为一个struct,其所有成员默认都是public的
namespace std {
template <typename T1,typename T2>
struct pair {
// member
T1 first;
T2 second;
};
}
操作函数 | 影响 |
---|---|
pair<T1,T2>P | Default构造函数,建立一个pair,其元素类型分别为T1和T2,各自以其default构造函数初始化 |
pair<T1,T2>p(vall,vall) | 建立-一个pair,元素类型分别为T1和T2,以vall和vall为初值 |
pair<T1,T2>p(rvl,rv2) | 建立一个pair,元素类型分别为T1和T2,以rvl和 |
rv2进行搬移式初始化(moveinitialized) | |
pair<T1,T2>p(piecewise_construct,tI,t2) | 建立-一个pair,元素类型分别为tupleT1和T2,以tuple tI和t2的元素为初值 |
pair<T1,T2>p(p2) | Copy构造函数,建立p成为p2的拷贝 |
pair<T1,T2>p(n) | Move构造函数,将rv的内容移至p(允许隐式类型转换) |
p=p2 | 将p2赋值给p(始自C++11;允许隐式类型转换) |
P=rv | 将rv的值moveassign给p(始自C++11;允许隐式类型转换) |
p.first | 获得pair内的第--value(直接成员访问) |
p.second | 获得pair内的第二value(直接成员访问) |
get<0>(p) | 等价于p.first(始自C++11) |
get<1>(p) | 等价于p.second(始自C++11) |
p1==p2 | 返回“是否p1等于p2”(等价于 |
p1.first==p2.first始p1.second==p2.second) | |
p1!=p2 | 返回“是否p1不等于p2"(!(p1==p2)) |
p1<p2 | 返回“是否p1小于p2"(比较first,如果相等则比较second) |
p1>p2 | 返回“是否p1比p2更大”(亦即p2<p1) |
p1<=p2 | 返回“是否p1小于等于p2”(!(p2<p1)) |
p1>=p2 | 返回“是否p1大于等于p2”(!(p1<p2)) |
p1.swap(p2) | 互换p1和p2的数据(始自C++11) |
swap(p1,p2) | 同上(是个全局函数)(始自C++11) |
make_pair(vall,val2) | 返回一个pair,带有vall和val2的类型和数值 |
//保存两个string,两个string初始化为空
pair<string, string> anon;
//保存一个string和一个size_t,string为空,size_t为0
pair<string, size_t> word_count;
//保存一个string和一个vector容器,string和vector均为空
pair<string, vector<int>> line;
pair<string, string> author{"James","Joyce"};
//等同于pair<string, string> author("James","Joyce");
class Foo {
public:
Foo(tuple<int, float>) {
cout << "F::Foo(tuple)" << endl;
}
template <typename... Args>
Foo(Args... args) {
cout << "F::Foo(args...)" << endl;
}
};
int main()
{
tuple<int, float> t(1, 2.22);
pair<int, Foo> p1(42, t);
pair<int, Foo> p2(piecewise_construct, make_tuple(42), t);
return 0;
}
F::F00(tuple)
F::Foo(args...)
void f(std::pair<int, const char*>);
void g(std::pair<const int, std::string>);
void foo()
{
std::pair<int, const char*> p(42,"hello");
f(p); //调用版本1
g(p); //调用版本2
}
class A
{
public:
A(A&);
};
int main()
{
std::pair<A, int> p; //错误
return 0;
}
pair<string, string> author{ "James","Joyce" };
cout << author.first <<"\n"<< author.second << endl;
template<typename T1,typename T2>std::ostream& operator<<(std::ostream& strm, std::pair<T1, T2>& p){return strm << "[" << p.first << "," << p.second << "]";}
typedef std::pair<int, float> IntFloatPair;IntFloatPair p(42, 3.14);
std::get<0>(p); //等价于p.firststd::get<1>(p); //等价于p.second
std::tuple_size<IntFloatPair>::value; //返回2std::tuple_element<0, IntFloatPair>::type num; //等价于int num
make_pair()函数的定义
void f(std::pair<int, const char*>);
void g(std::pair<const int, std::string>);
void foo()
{
f(std::make_pair(42, "empty")); //直接创建pair
g(std::make_pair(42, "chair")); //创建pair时需要类型转换
return 0;
}
std::pair<int, float>(42, 7.77);std::make_pair(42, 7.77);
std::string s, t;//使用s和t初始化一个pair,s和t使用移动语义,表示之后不再使用auto p = std::make_pair(std::move(s), std::move(t));
int i = 0;
auto p = std::make_pair(std::ref(i), std::ref(i));++p.first;++p.second;
std::cout << "i:" << i << std::endl; //打印2
std::pair<char, char> p = std::make_pair('x', 'y');
char c;
std::tie(std::ignore, c) = p;
std::cout << c << std::endl; //y
pair<string, int> process(vector<string> &v)
{
if (!v.empty())
return{ v.back(),v.back().size() }; //初始化器返回
else
return pair<string, int>();//隐式构造返回
//return pair<string, int>(v.back(),v.back().size);//显示构造返回
}
if (!v.empty)return make_pair{ v.back(),v.back().size };