声明:这个博文所有内容均来自于C++标准库-自学教程与参考手册(第二版)英文版 上册。如果转载,务必附带本声明,请注明出处。
1、pairs
pair是C++里面很好用的,在Qt里经常使用(虽然也有Qt自带的)。
pair其实很简单,就是将两个元素做成一对,这对于存储两个有关联的数据,是很有意义的。存储的元素类型可以是C++允许的任何类型。
#include <iostream>
using std::cout;
using std::endl;
int main()
{
typedef std::pair<int, float> IntFloatPair;
IntFloatPair p(42, 3.141592);
std::cout << std::get<0>(p) << std::endl << std::get<1>(p); // 42
std::cout << std::tuple_size<IntFloatPair>::value << std::endl; //3.1415926
//std::cout << std::tuple_element<0, IntFloatPair>::type << std::endl;
auto p2 = std::make_pair(42, '@');
std::cout << p2.first << "\t" << p2.second << std::endl;
std::cout << "p2.second's type:"<< typeid(p2.second).name() << std::endl;
int i = 0;
auto p3 = std::make_pair(std::ref(i), std::ref(i)); //传引用的值
++p3.first;
std::cout << p3.first << ' ' << std::endl;
++p3.second;
std::cout << p3.second << std::endl;
return 0;
}
2、tuple
#include <iostream>
#include <complex>
#include <tuple>
#include <string>
int main()
{
std::tuple<std::string, int, int, std::complex<double>> t;
std::tuple<int, float, std::string> t1(41, 6.3, "nico");
std::cout << std::get<0>(t1) << " "
<< std::get<1>(t1) << " "
<< std::get<2>(t1) << std::endl;
auto t2 = std::make_tuple(22, 44, "nico");
std::get<1>(t1) = std::get<1>(t2);
std::cout << std::get<1>(t1) << std::endl;
}
可以看到std::make_tuple虽然能比较方便的创建一个tuple,但是它创建的内部元素类型不见得是你想要的,它是通过推导得到的类型。最好还是显示地指定。
还有一个就是std::tie(),这个函数直接能够创建一个引用。
std::tie(std::get<0>(t), std::get<1>(t), std::get<2>(t)) = t1;//将t1的值分别传递给t的前三个
std::cout << std::get<0>(t) << " "
<< std::get<1>(t) << " "
<< std::get<2>(t) << std::endl;
其他特性:
int main()
{
auto mytuple = std::make_tuple(10, 'a');
std::tuple_element<0, decltype(mytuple)>::type first = std::get<0>(mytuple);
std::tuple_element<1, decltype(mytuple)>::type second = std::get<1>(mytuple);
std::cout << "mytuple contains: " << first << " and " << second << '\n';
int n = 0;
auto t = std::tuple_cat(std::make_tuple(42, 7.7, "hello"), std::tie(n));
std::cout << std::get<3>(t) << std::endl;
std::tuple < int, float, std::string > t2(77, 1.1, "more light");
//std::cout << t2 << std::endl; //编译不能通过, VS2013
return 0;
}