一、pair 提供了直接访问对应数据成员的能力,因为pair是struct而不是class,默认所有成员都是public

二、所有元素都相等,这两个pair对象才相等

三、如果first相等,才继续比较second

四、pair的copy构造函数有两个版本

1、版本1接受相同类型的pair

2、版本2是个member template,在“构造过程中需要隐式类型转换”时被调用

五、如果pair对象被复制,调用的是被隐式合成的那个copy构造函数

六、只有piecewise_construct作为第一实参,且后面两个实参都是tuple时时,才会调用pair的第三个构造函数

七、可以使用get()获取first或second

八、可以使用tuple_size<>::value获取元素个数。可以使用tuple_element<>::type获取元素类型

九、c++11开始,可以使用move semantic或reference semantic来影响make_pair()产出的类型

1、move semantic。 使用std::move()声明被传递的实参不再使用

2、reference semantic。使用ref()强迫形成一个reference类型,或使用cref()强迫形成一个const reference类型

十、c++11开始,可以使用定义于内的tie()接口,抽取出pair的value

十一、tuple是TR1引入的,由于TR1用的是c++98特性,即不可能定义出一个“参数个数不定”的template,所以实际是有限的。c++11开始,引入了variadic template,使template得以接受任何数量的template实参

十二、tuple不允许迭代元素,可以使用get获取元素。必须再编译期传入索引值,如果在运行期才传入索引值,编译器会报错

十三、reference_wrapper<>以及ref(), cref()可以影响make_tuple()产生的类型

十四、使用reference搭配make_tuple可以提取tuple的元素值。方便的做法是tie(),使用它tie()时,使用std::ignore允许忽略tuple的某些元素

十五、可以使用tuple_cat()串接tuple,pair<>也可以

//---------------------pair start--------------------------------
// pair 提供了直接访问对应数据成员的能力,因为pair是struct而不是class,默认所有成员都是public
/*template<typename T1, typename T2>
struct pair
{T1 first;T2 second;pair(const T1& x, const T2& y);template<typename U, typename V>pair(U&& x, V&& y);template<typename...Args1, typename...Args2>pair(piecewise_construct_t, tuple<Args1...> first_args, tuple<Args2...> second_args);
};*/
/*template<typename T1, typename T2>
pair<V1, V2> make_pair(T1&& x, T2&& y);*/
/*template<typename T1, typename T2>
bool operator==(const pair<T1, T2>& x, const pair<T1, T2>& y)
{// 所有元素都相等,这两个pair对象才相等return x.first == y.first && x.second == y.second;
}*/
/*template <typename T1, typename T2>
bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y)
{// 如果first相等,才继续比较secondreturn x.first < y.first || (!(y.first < x.first) && x.second < y.second);
}*/void f(std::pair<int, const char*> ic)
{cout << "key: " << ic.first << "value:" << ic.second << endl;
}
void g(std::pair<const int, string> is)
{cout << "key: " << is.first << "value:" << is.second << endl;
}
void foo()
{//pair的copy构造函数有两个版本//版本1接受相同类型的pair//版本2是个member template,在“构造过程中需要隐式类型转换”时被调用//如果pair对象被复制,调用的是被隐式合成的那个copy构造函数std::pair<int, const char*> p(42, "hello");f(p); //调用的是被隐式合成的那个构造函数g(p);//调用的是template构造函数f(std::make_pair(42, "empty"));g(std::make_pair(42, "empty"));//c++11开始,也可以使用初值列f({ 42, "empty" });g({ 42, "empty" });
}class PairConstructTest
{
public:PairConstructTest(tuple<int, float>){cout << "PairConstructTest::PairConstructTest(tuple)" << endl;}template<typename...Args>PairConstructTest(Args... args){cout << "PairConstructTest::PairConstructTest(args...)" << endl;}
};
void testPairConstruct()
{tuple<int, float> t(1, 2.22);pair<int, PairConstructTest> p1(42, t);// 只有piecewise_construct作为第一实参,且后面两个实参都是tuple时时,才会调用pair的第三个构造函数pair<int, PairConstructTest> p2(piecewise_construct, make_tuple(42), t);
}void pairLearn()
{typedef std::pair<int, float> intFloatPair;intFloatPair p(42, 3.14);//可以使用get()获取first或secondstd::get<0>(p); // p.firststd::get<1>(p); // p.second//可以使用tuple_size<>::value获取元素个数std::tuple_size<intFloatPair>::value;//可以使用tuple_element<>::type获取元素类型std::tuple_element<0, intFloatPair>::type;//c++11开始,可以使用move semantic或reference semantic来影响make_pair()产出的类型//move semantic。 使用std::move()声明被传递的实参不再使用string s = "hello";string t = "world";std::make_pair(std::move(s), std::move(t));//reference semantic。使用ref()强迫形成一个reference类型,或使用cref()强迫形成一个const reference类型int i = 0;int j = 0;std::make_pair(std::ref(i), ref(j));//c++11开始,可以使用定义于<tuple>内的tie()接口,抽取出pair的valuestd::pair<char, char> pc = std::make_pair('x', 'y');char resc;std::tie(std::ignore, resc) = p;
}
//---------------------pair end--------------------------------//---------------------tuple start--------------------------------
template<typename... Types>
/*class tuple
{
public:// 接受不定个数的实参的构造函数时explicit的explicit tuple(const Types&...);template<typename... UTypes>explicit tuple(UTypes&...);
};*/
void tupleLearn()
{//tuple是TR1引入的,由于TR1用的是c++98特性,即不可能定义出一个“参数个数不定”的template,所以实际是有限的//c++11开始,引入了variadic template,使template得以接受任何数量的template实参tuple<int, float, string> t1(42, 6.3, "hello");// tuple不允许迭代元素,可以使用get获取元素// 必须再编译期传入索引值,如果在运行期才传入索引值,编译器会报错//int i;//get<i>(t1); // 报错cout << std::get<0>(t1) << " ";cout << std::get<1>(t1) << " ";cout << std::get<2>(t1) << " ";cout << endl;auto t2 = make_tuple(22, 44, "hello");cout << std::get<0>(t2) << " ";cout << std::get<1>(t2) << " ";cout << std::get<2>(t2) << " ";cout << endl;//reference_wrapper<>以及ref(), cref()可以影响make_tuple()产生的类型string s("my value");auto x = make_tuple(s);std::get<0>(x) = "my value x";cout << "x:" << std::get<0>(x) << " s:" << s << endl;auto y = make_tuple(ref(s)); std::get<0>(y) = "my value y"; // 同时修改了s的值cout << "y:" << std::get<0>(y) << " s:" << s << endl;tuple<int, float, string> t3(42, 3.14, "hello");int t3i;float t3f;string t3s;// 使用reference搭配make_tuple可以提取tuple的元素值//make_tuple(ref(t3i), ref(t3f), ref(t3s)) = t3;//方便的做法是tie()std::tie(t3i, t3f, t3s) = t3;cout << " t3i: " << t3i << endl;cout << " t3f: " << t3f << endl;cout << " t3s: " << t3s << endl;cout << endl;//使用它tie()时,使用std::ignore允许忽略tuple的某些元素int t3i1;string t3s1;std::tie(t3i1, std::ignore, t3s1) = t3;;cout << " t3i1: " << t3i1 << endl;cout << " t3s1: " << t3s1 << endl;cout << endl;// 可以使用tuple_cat()串接tuple,pair<>也可以auto tcat = tuple_cat(t1, t2);cout << std::get<0>(t2) << endl;
}
//---------------------tuple end--------------------------------int main()
{pairLearn();testPairConstruct();tupleLearn();return 0;
}

c++标准库第五章通用工具5.1Pari和Tuple相关推荐

  1. C++_泛型编程与标准库(五)

    C++_泛型编程与标准库(五) 图中标红部分为自己的笔记理解 1.容器与容器之间的关系 2.深度探索list list是双向链表,从vc2019的list源码和以下图片都可以看出 template & ...

  2. Python程序设计题库——第五章

    第五章 一. 单选题(共60题,24分) 以下选项中,关于Python字符串的描述错误的是( ) A. Python语言中,字符串是用一对双引号""或者一对单引号 '' 括起来的零 ...

  3. 图形界面 I: 在METATRADER 4终端中使用不同类型的程序来测试界面库 (第五章)

    目录 简介 在指标中使用表单 在脚本程序中使用表单 在 MetaTrader 4中使用界面库 结论 简介 本文是关于图形界面系列文章第一部分的续篇. 第一篇文章, 图形界面 I: 库结构的准备工作 ( ...

  4. C++标准库 第七章 STL迭代器

    迭代器 能力:行进和存取的能力 Input迭代器 一次一个向前读取元素,按此顺序一个一个返回元素 例子:从标准输入装置(键盘) 读取数据,同一个数据不会被读取两次,流水一样,指向的是逻辑位置 使用前置 ...

  5. python中函数包括标准库函数吗_Python语言和标准库(第二章:函数)

    a-如何创建函数. b-给出一些指导原则,帮助思考如何创建和组织程序以使用函数. c-如何编写函数,使随后可以询问它们的工作方式和实现的功能. 2.1将程序放在单独的文件里 为了更加方便,从现在开始, ...

  6. JavaScript权威指南 第11章JavaScript标准库

    JavaScript权威指南 第11章JavaScript标准库 第11章 JavaScript标准库 11.1 集合与映射 11.1.1 Set类 11.1.2 Map类 11.1.3 WeakMa ...

  7. c 程序设计语言标准库,C++程序设计语言(第4部分:标准库)(原书第4版) 中文pdf扫描版[86MB]...

    C++语言之父的经典名著之最新版本,全面掌握标准C++11及其编程技术的权威指南! 第1版1985年,第2版1991年,第3版1997年,特别版2000年,第4版2013年,经典无限延伸-- C++程 ...

  8. [单刷APUE系列]第五章——标准I/O库

    目录 [单刷APUE系列]第一章--Unix基础知识[1] [单刷APUE系列]第一章--Unix基础知识[2] [单刷APUE系列]第二章--Unix标准及实现 [单刷APUE系列]第三章--文件I ...

  9. apue学习第九天——标准I/O库(第五章)

    这是第五章标准I/O库的内容,花了几个小时浏览了一遍.感觉这些东西在第一遍看的时候没必要太抠细节,用到的时候再查,所以下面只是简单记录,好啦,开始. 首先,给stream一个系统的定义:In comp ...

最新文章

  1. asp.net操作cookie
  2. linux下find查找带有指定权限的文件(windows下编译的源代码文件)
  3. 独家定制「炼丹贴纸」免费送,让你成为实验室最靓的仔
  4. [bzoj2159]Crash 的文明世界
  5. java freememory 单位_Runtime类中的freeMemory,totalMemory,maxMemory区别
  6. 无心剑中译马塞尔·普鲁斯特《追忆似水年华》
  7. 设计导航网站|解决寻找合适的字体麻烦
  8. 常见印花疵点及产生原因
  9. RT-Thread源码获取--Keil官网和GitHub
  10. sketchup 计算机配置,草图大师2020对电脑配置要求
  11. 成都-峨眉山(乐山)旅游攻略
  12. U盘蠕虫病毒解决办法
  13. css3扇形及简单动画
  14. python图像处理 马赛克效果
  15. SQL dialect is not configured.
  16. 第一次面试----华为实习生招聘
  17. 别再说你不知道分布式事务了
  18. 微信开发整理生成jar包
  19. Shell 脚本中 set -ex 命令的作用
  20. Firebird使用02

热门文章

  1. 2021年统考计算机应用基础,2021年电大网考计算机应用基础统考答案-20210511065851.doc-原创力文档...
  2. 如何设置电信IPTV机顶盒为路由器联网方式
  3. 快讯 | 三创文创项目参展清华文创嘉年华
  4. 南京银行信息技术岗提前批笔试与面试
  5. ctf中MISC之MP3等音频隐写
  6. 区块链电商:信息透明可视化,加强溯源防伪信用建档
  7. MySQL忘记登录密码解决
  8. 9.15 复习一天,html hr简介
  9. 如何走好知识变现第一步
  10. 让页面跳舞的Javascript库Rythm.js