基础知识和c++stl库

基础知识

竞赛常用语言—C++

  1. 绝大部分情况下用C++(效率高、code速度快),少数情况用Java(有大数)、Python(兼容度不高)
  2. 输入输出:cin cout
  3. 万能头文件 #include<bits/stdc++.h>
  4. 数组尽量放全局
  5. 数组尽量开大

时间(空间)复杂度

1.时间复杂度:又称时间复杂性,用来描述程序运行时间与输入数据规模的函数关系
2.算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
3.时间复杂度只保留最高项,忽略常数
O(2n2+5n+10)=O(n^2)
O(2n+n100+5)=O(2^n)
O(3n+logn)=O(n)
O(1000)=O(1)
4.常见算法的复杂度O(n) O(n2) O(nlogn) O(2^n)
在这里插入图片描述
5.一秒钟可以执行多少次运算? 约8e8
各个复杂度的算法中,n可以取多大?
1G内存可以开多大数组?
int 2e8
256MB 5e7

STL

STL:C++标准模板库(Standard Template Library)

STL:容器

string 动态长度字符串

  • 构造函数 string s1="1234"
  • 迭代器:string::iterator it=s1.begin()
  • 常用函数:clear() length() push_back() append() find() erase()

vector 动态数组,内存连续

  • 构造函数:vector<int>v1;vector<string>v2("1234"); vecotr<int>v3(5,2);vector<int>v4(v3);
  • 常用函数:push_back() pop_back() front() back() insert() erase() size()
  • 可以随机访问 访问O(1) 删除O(n)

queue 队列,先进先出(FIFO) 打印机、排队队伍

  • 构造函数vector<int>v1;vector<string>v2("1234"); vecotr<int>v3(5,2);vector<int>v4(v3);
  • 常用函数:push() pop() front() back() size() empty()

stack 堆栈,先进后出(FILO)

  • 构造函数stack<int>st;
  • 常用函数:push() pop() top() size() empty()

set 集合,元素有序排列、不重复

  • 构造函数:set<int>se
  • 常用函数:insert() erase() find() size() clear() count()
    lower_bound(x):大于等于x的第一个元素位置,不存在返回end()
    upper_bound(x):大于x的第一个元素位置,不存在返回end()
  • 查询、插入、删除O(logn)

map 字典,key-value键值对,按key有序排列

  • 构造函数:map<int,int>mp
  • 常用函数:erase() find() size() clear() count() lower_bound() upper_bound()
  • 可以像数组一样通过[]访问
  • 插入、删除O(logn)
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t,n;
    cin>>t;
    while (t--)
    {
        cin>>n;
        map<string,map<string,int>>mp;
        for (int i = 0; i < n; i++)
        {
            string a,b;
            int c;
            cin>>a>>b>>c;
            mp[b][a]+=c;
        }
        for (auto it = mp.begin(); it != mp.end(); it++)
        {
            cout<<it->first<<endl;
            for (auto it2 = it->second.begin(); it2 != it->second.end(); it2++)
            {
                cout<<"   |----"<<it2->first<<"("<<it2->second<<")"<<endl;
            }
        }
        if (t) cout<<endl;
    }  
}

list 双向链表,内存不连续

在这里插入图片描述

  • 构造函数:list<int>li
    常用函数:push_back() push_front() pop_back() pop_front() insert() erase()
  • 不支持随机访问,插入、删除O(1),与vector相反

sort

vector<int>ve({4,3,5,2,6,1}); 
sort(ve.begin(),ve.end());
sort(ve.begin(),ve.end(),greater<int>());
bool cmp(int a,int b)
{
	if(a%2==b%2) return a<b;
	return a%2>b%2;
}
sort(ve.begin(),ve.end(),cmp);

reverse 翻转数组、容器

int x[1005];
reverse(x+1,x+1+n);
vector<int>ve;
reverse(ve.begin(),ve.end());

next_permutation

求全排列中字典序更大的一个序列,不存在更大时返回false

int x[105];
int n=5;
for(int i=1;i<=n;i++)x[i]=i;
do{
	for(int i=1;i<=n;i++)printf("%d ",x[i]);
	puts("");
}while(next_permutation(x+1,x+1+n));

有待了解

  • multiset
  • priority_queue
  • deque
  • unordered_map
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值