(ACM)C++ STL 训练(第一天)

因为老师说ACM考的是纯C++,所以打算抛弃VS的VC++不用了,针对纯C++的编译器有Intel Compiler(不过要钱),MinGw(个人用的),当然还有微软的VC++ 编译器,IDE你们可以选择CLion,用过几次,非常强大,可惜要钱。Dev C++,这个也很不错,个人推荐,并且这个不用配置编译环境,安装之后直接用,Code block,许多人的最爱,也得配置环境,用的也挺舒适的。我用的是QT5.7+MinGw。QT这个一定耳熟能详,不了解的自己去搜,也是非常棒的一个IDE。

第一天:通用工具(一)

Pair:他是一个结构体,里面的成员都是public,类似于字典Dictionary的键值对的格式,Pair的头文件是#include<utility>

 1 pair的定义:
 2  namespace std{
 3      template <typename T1,typename T2>
 4      struct pair{
 5          T1 first;
 6          T2 second;
 7          ...
 8      };
 9  }
10
11 pair的初始化:
12 1.   pair<T1,T2> p;  //默认构造函数,如果要为p赋值要用make_pair方法,如
13       p=make_pair(1,1);   //这里的T1,T2就是int类型
14 2.   pair<T1,T2> p(1,1);  //直接给p赋值
15 3.   pair<T1,T2> p(p2);   //Copy构造函数,将p2的值赋给p
16 4.   pair<T1,T2> p(rv);    //Move构造函数,将rv的值移动到p(允许隐式类型转换)
17
18 pair赋值:
19 1.   p=p2;   //将p2的值赋给p;
20 2.   p.first ,  p.second  ;    //求出p的第一个和第二个的值
21 3.   get<0>(p);  //等同于p.first   (始自C++11)
22 4.   get<1>(p);  //等同于p.second(始自C++11)
23
24 pair比较:
25 1.   p1==p2;    //返回p1是否等于p2,即bool值,等同于p1.first==p2.first&&p1.second==p2.second  ,其他同理
26 2.   p.swap(p1);   //交换p,p1的值(始自C++11)
27 3.   swap(p1,p2);  //同上,swap是个全局函数(始自C++11)
28
29 pair赋值:
30 p=make_pair(v1,v2);

另外,从C++11起,可以对pair使用一份tuple-like接口。

1 typedef std::pair<int,float> IntFloatPair;
2 IntFloatPair p(42,3.14);
3
4 std::get<0>(p);   //获得第一个值
5 std::get<1>(p);   //获得第二个值
6 std::tuple_size<IntFloatPair>::value;   //获得元素的个数
7 std::tuple_element<IntFloatPair>::type;  //获得元素的类型

QT格式化代码(使代码整齐)的快捷键是:Ctrl+A,Ctrl+I;

这就是上面的例子的具体代码,其中数据类型int输出为i,float输出为f

#include <iostream>
#include<utility>
#include<typeinfo>
using namespace std;
typedef std::pair<int,float> IntFloatPair;
int main(int argc, char *argv[])
{

    IntFloatPair p(42,3.14);
    std::get<0>(p);   //获得第一个值
    std::get<1>(p);   //获得第二个值
    cout<<std::tuple_size<IntFloatPair>::value<<endl;   //获得元素的个数
    cout<<typeid(std::tuple_element<0,IntFloatPair>::type).name()<<endl;  //获得元素的类型
    cout<<typeid(p.first).name()<<endl;  //用typeid输出变量类型
    cout<<get<0>(p)<<endl;
    cout<<p.first<<endl;
    return 0;
}

pair<int,float> p;   //p.first和p.second默认为0,如果是pair<string,char> p; 则p.first,p.second估计是nul
#include<iostream>
#include<utility>
#include<tuple>
using namespace std;

class Foo{
public:
    Foo(tuple<int,float>){
        cout<<"Foo::Foo(tuple)"<<endl;
    }
    template<typename...Args>  //变长参数模板,Args是模版
    Foo(Args... args){
        cout<<"Foo::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;
}

上述代码中,只有当std::piecewise_construct被当作第一个参数,class Foo才会被迫使用那个实参数量不定的构造函数,如果提供了Foo::Foo(int,float)的话,调用的就是他。如你所示,两个实参都必须是tuple才会强迫导致这个行为,因此,第一个参数被显示转化为tuple类型,用的是make_tuple(),也可以改传std::tuple(42)。

时间: 2024-08-09 15:36:38

(ACM)C++ STL 训练(第一天)的相关文章

2015 ACM多校训练第一场

在下面网址看效果更佳>_< http://mlz000.github.io/2015/08/07/2015-ACM%E5%A4%9A%E6%A0%A1%E8%AE%AD%E7%BB%83%E7%AC%AC%E4%B8%80%E5%9C%BA/ 题外话 这个暑假以前就决定要把这次多校的所有题全补了,中间断断续续,总算把第一场的题补全了,鄙视一下颓废的自己... hdu 5288(1001) OO's Sequence Solution 水题,定义两个数组L[i],R[i]示第i个数左侧和右侧最接

ACM/ICPC算法训练 之 数学很重要-浅谈“排列计数” (DP题-POJ1037)

这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列计数 的方法,虽然排列计数的思路简单,但却是算法中一个数学优化的点睛之笔. Poj1037  A decorative fence 题意:有K组数据(1~100),每组数据给出总木棒数N(1~20)和一个排列数C(64位整型范围内),N个木棒长度各异,按照以下条件排列,并将所有可能结果进行字典序排序 1.每一

2014多校联合训练第一场(组队训练)

这是我.potaty.lmz第二次训练,毕竟经验不足,加上水平不够,导致我们各种被碾压. A - Couple doubi: 这道题是道比较水的数论.但我们都没想出来要怎么做.后来是potaty提议打个表看看,然后lmz打出表后发现了规律.我还没细看,待研究后再补全. D - Task: 这道题一看就知道是个贪心(现在只要是有deadline的题我都觉得是贪心了).虽然想出来了,但还是不会严格证明为什么只要取满足task的且y最小(y相等时x最小)的machine就行了. 我的做法是把所有mac

几道STL题目(FJUT - OJ STL训练1)

这个OJ一直在做,一些专题题目都很好,从易至难,阶梯上升,很适合像我这样的蒟蒻 =7= 这篇是关于其中一个专题训练的题解思路及代码   http://120.78.128.11/Contest.jsp?cid=486 所有题面我就不贴了,各位自行去看,链接在上一行 =7= 一.求众数(Map标记+Set) 其实数组维护也可以做,但既然是STL训练,就用STL的东西了 用map标记数据和出现的次数,然后转入结构体存入map中 为什么不直接用set<map<T,T> >的形式 是因为m

ACM/ICPC算法训练 之 数学问题

好歹我是数学专业的学生,还是要写写训练的时候遇到的数学问题滴~~ 在ACM集训的时候在各高校OJ上也遇见过挺多的数学问题,例如大数的处理,素数的各种算法,几何问题,函数问题(单调,周期等性质),甚至是各种数学定理或公式的变形.其实算法本身也属于数学研究的范畴(计算机本就是数学的衍生嘛),诸如众多排序算法,搜索算法也是许多精巧的数学逻辑思维,所以大家学计算机千万别忽视数学这门基础学科啊. 貌似说了好多废话= =||,待小编进入正题,今天在湖大OJ训练赛上看到一道数学题,话不多说,直接上图! ___

ACM题目————STL练习之众数问题

描述 所谓众数,就是对于给定的含有N个元素的多重集合,每个元素在S中出现次数最多的成为该元素的重数, 多重集合S重的重数最大的元素成为众数.例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3. 现在你的任务是:对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数. 输入 第一行为n,表示测试数据组数.(n<30)每组测试的第一行是一个整数m,表示多重集S中元素的个数为m接下来的一行中给出m(m<100)个不大于10万的自然数(不会出现不同元素出现的次数相同的情况,如

暑假训练第一周总结

本周训练主要训练的知识点主要是并查集,线段树,RMQ,树状数组的以及字典树,ac自动机,二分图,树上dp的复杂形势,lca 开始在刷acm step,刷到并查集的时候,几道题目都不会做,没有学习过并查集,然后看kuangbin并查集,挑战程序设计和红书例题,带权并查集什么的,很简单,切了 然后是二分图,二分图知识以前并不了解,acm step有一章的二分图的题目,求最大匹配或者最大独立集,理解匈牙利算法难度不是很高,了解了一些建图的套路 区间问题用的算法,感觉有些漏洞,uva的题写了几道,其他的

STL标准程序库第一部分总结(Auto_ptr&amp;&amp;numeric_limits,标准模板库,迭代器的配接器)

一 Auto_ptr的使用 1 auto_ptr 拥有权的转移(auto_ptr要求一个只能有一个对象只能有一个拥有者,严谨一无二主) Std::auto_ptr<ClassA>ptr1(new ClassA) Ptr1拥有new出来的对象 Std::auto_ptr<ClassA>ptr2(ptr1) 把控制权交给ptr2此后ptr2就拥有了new出来的对象而ptr1不在拥有它了 2通过赋值实现 Std::auto_ptr<ClassA>ptr1(new ClassA

STL学习第一章 了解STL

知识内容: 1.STL介绍 2.C++基础知识复习 3.C++中的模板简单介绍 4.STL组成部分 一.STL介绍 1.什么是STL? 学过C++的应该都听说过STL,那么什么是STL呢?STL是Standard Template Library的简称,翻译为标准模板库,是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R Musser在惠普实验室工作时所开发出来的.从根本上说,STL是一些"容器"的集合,这些"容器