STL,基础数学

算法 类型 Structure function 备注
不变序列算法O(n) 顺序容器/关联容器均适用 iterator min_element(iterator first, iterator last[,Pred op])
iterator max_element(iterator first, iterator last[,Pred op])
int count(iterator first, iterator last,const T& val)
iterator find(iterator first, iterator last,const T& val)
插入算法第一个被插入元素的迭代器first Single element vector iterator insert (const_iterator position, const value_type& val);
set pair<iterator,bool> insert (const value_type& val); pair::second inserted(1)or existed(0)
String string& insert (size_t pos, const char* s);
Fill vector iterator insert (const_iterator position, size_type n, const value_type& val);
String string& insert (size_t pos, size_t n, char c);
Range vector,String iterator insert (const_iterator position, InputIterator first, InputIterator last);
Buffer String string& insert(size_t pos, const string& str, size_t subpos, size_t sublen); 个数
删除算法返回被删除元素的下一个迭代器last Single element vector,set iterator erase (const_iterator position);
Unfill set size_type erase(const value_type& val); 个数
Range vector,set iterator erase(const_iterator first, const_iterator last);

1.输入方式大总结

getline(cin,str):
std::basic_istream& getline(std::basic_istream&__is, std::__cxx11::basic_string& __str);

//解析一个字符的三种方式
scanf("%c",&ch);
ch=cin.get();
ch=getchar();
//解析一个字符串的方式
char m[20];
gets(m);
cin.getline(m,5);//多了一个参数,可以加结束符
cin.get(m,20);//多了一个参数,可以加结束符

%2d就是将数字按照宽度为2 采用右对齐方式输出,若数据位数不到2位,则左边补空格

%02d和%2d差不多 只不过左边补0

toupper,tolower的使用

2."对应"的处理

法1:建表
char c[14] = {"0123456789ABC"};
printf("#");
for(int i = 0; i < 3; i++) {
    int num;
    scanf("%d", &num);
    printf("%c%c", c[num/13], c[num%13]);
}
return 0;
法2:直接函数输出

3.cmp的写法

int cmp(node& a, node& b) {//Tips:引用传递和地址传递效率高于直接传递
    if ((a.de1 + a.cai) != (b.de + b.cai))
        return (a.de + a.cai) > (b.de + b.cai);//技巧:以求和代替求平均值
    else if (a.de != b.de) return a.de > b.de;
    else return strcmp(a.name, b.name) < 0;//char name[9]
        //还可以string a.name<b.name;
}

并列排名问题

struct node {
    int id, best;
    int score[4], rank[4];
};//一般一个结构体
for(i=0;i<sch.size();++i){
 for(j=0;j<k;++j){
        bool y;
        int choice=sch[i].sc[j];
        int x=ans[choice].size();
        if(x>0){
            int last=x-1;
            y=sch[i].grade[0]==ans[choice][last].grade[0]&&sch[i].grade[1]==ans[choice][last].grade[1];
            x=y?ans[choice][last].rank:x;
        }
        if(x<full[choice]||y){
            ans[sch[i].sc[j]].push_back(sch[i];
            break;
        }
}
for(flag = 0; flag <= 2; flag++) {
        sort(ans.begin(), ans.end(), cmp1);
        for(int i = 0; i < n; i++) {
            ans[i].rank[flag] = i;
            if(i>0&&ans[i].grade[flag] == ans[i-1].grade[flag])//注意多一个判断还有反向
            ans[i].ans[flag] = ans[i-1].rank[flag];
        }
}

4.输出格式

普通输出问题

for (int i = 0; i < 4; i++) {
    sort(v[i].begin(), v[i].end(), cmp);
    for (int j = 0; j < v[i].size(); j++){//小技巧:利用顺序条件,如求一串码中只出现一次的元素
        if(j!=0)printf(" ");
        printf("%d", v[i][j].num);
    }
    printf("\n");
}

条件补零问题Eg:保留n位小数(temp.size可大可小)

while(temp.size()<N)//有效数字位数小于N
temp+="0";//在字符串末尾加足够的0保证有N位有效数字

5.排序题

多维排序-->找参考系

1比较时间实际可以t[j]-t[i](从0:0:0开始)

2求连续字符串和满足一定条件-->sum[j]-sum[i]

[易错点]多余链表、记录的问题

PAT1016 Phone Bills

夹逼题:[a,b]!c

for(j=temp;st[j].time<=cal(c)&&j<st.size();++j)
    if(st[j].status==0)sum++;
    else sum--;

//[f,l),[,Compare comp]
void pop_heap(iterator first, iterator last);//向下调整,原堆顶->last-1,O(log(n))
void push_heap(iterator first, iterator last);//向上调整O(log(n))
void make_heap(iterator first, iterator last);//建堆O(n)
void sort_heap(iterator first, iterator last);//建堆后排序O(nlog(n))

6.运行超时:

  • 循环内套了一个大函数:如循环内sort(>1000),或是一个大数组(\(10^5\))的cin-->scanf
  • 外循环与内循环条件对换,可以减少重复

原文地址:https://www.cnblogs.com/chanceYu/p/12037269.html

时间: 2024-10-14 08:21:47

STL,基础数学的相关文章

STL学习思想

1.模版:一定要注意参数和返回值的模版 2.STL一系列的API:一定要注意返回值 3.容器中的都是值拷贝,而不是引用,在执行插入时,内部实行拷贝动作,所以STL中插入类时,一般都必须:无参构造函数,拷贝构造函数,重载=运算符,必须的自己重写,达到深拷贝!!! 4.一元谓词:函数只有一个参数,谓词:代表函数的返回值必须为bool类型;   二元谓词:函数只有二个参数,谓词:代表函数的返回值必须为bool类型; 5.算法和具体的数据类型相分离:通过函数对象(仿函数)来实现,本质:函数指针!!! 6

C++ STL学习——vector

学过C++的人肯定会很熟悉STL标准模板库,STL其实就是封装了一系列的接口,供我们调用.很多函数或者算法的实现不需要我们从头开始写,大大提高我们的编程效率.这篇博客在简单介绍STL的情况下,会详细的来介绍vector的使用. STL共有六大组件: 一.容器(Container):是一种数据结构,如list,vector,deque,queue等,以模板类的方法提供,为了访问容器中的数据,可以使用由容器类提供的迭代器. 二.迭代器(Iterator):提供了访问容器中对象的方法. 三.算法(Al

C++ STL中Map的按Key排序和按Value排序

原文  http://blog.csdn.net/iicy266/article/details/11906189 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学

stl容器区别: vector list deque set map及底层实现

在STL中基本容器有: vector.list.deque.set.map set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问 set :集合, 用来判断某一个元素是不是在一个组里面,使用的比较少 map :映射,相当于字典 ,把一个值映射成另一个值,如果想创建字典的话使用它好了 底层采用的是树型结构,多数使用平衡二叉树实现 ,查找某一值是常数时间,遍历起来效果也不错, 只是每次插入值的时候,会重新构成底层的平衡二叉树,效率有一定影响. vector.list.dequ

STL vector,deque,list

一.vector可变长的动态数组必须包含头文件 #include <vector>支持随机访问迭代器• 根据下标随机访问某个元素时间为常数• 在尾部添加速度很快• 在中间插入慢所有STL算法 都能对vector操作 构造函数初始化:vector();无参构造函数, 将容器初始化成空的vector(int n);将容器初始化成有n个元素vector(int n, const T & val);假定元素类型是T, 将容器初始化成有n个元素, 每个元素的值都是valvector(iterat

C++ STL hash_map的使用以及STL hash_map的大“坑”

计算机编程中经常会用到hash表,而在C++中,使用STL编程更是少不了的.本文将介绍STL中hash_map的使用.在hash_map中使用自定义类型作为key值的方法以及在使用char *类型作为key值时遇到的问题. 一.需要的头文件以及命名空间 在linux下使用STL hash_map除了需要引用其所在头文件<hash_map>之外还要引用其命名空间.像这样写  1 using namespace __gnu_cxx; 二.hash_map的定义 先来看看hash_map是怎么定义的

c++ STL容器初探

什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种"对象"还包含了一系列处理"其它对象"的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是"容器类是一种对特定代码重用问题的良好的解决方案". 容器还有另一个特点是容器可以自行扩展.在解决问题时

stl源码剖析 详细学习笔记 算法总览

//****************************基本算法***************************** /* stl算法总览,不在stl标准规格的sgi专属算法,都以 *加以标记 算法名称              算法用途         质变                   所在文件 accumulate          元素累计            否                   <stl_numeric.h> adjacent_differenc

stl源码剖析 详细学习笔记 算法(1)

//---------------------------15/03/27---------------------------- //算法 { /* 质变算法:会改变操作对象之值 所有的stl算法都作用在由迭代器[first,last)所标示出来的区间上.质变算法 就是 运算过程会更改区间内的元素内容 非质变算法:和质变算法相反 */ /* stl算法的一般形式 1>所有的泛型算法的前两个参数都是一对迭代器,通常称为first和last,用以标示算法的操作区间 2>stl习惯采用前闭后开区间