C++STL(北理acm)学习笔记1

本文介绍了C++中的基本输入输出操作,如使用iostream处理cin和getline,以及字符串操作。还详细讲解了vector容器的使用,包括push_back和迭代器。此外,提到了algorithm头文件中的排序算法sort,以及map和set等数据结构。文章还讨论了bitset位操作和C++标准库的一些重要函数。
摘要由CSDN通过智能技术生成

上教学视频链接

#include<iostream>
#include<string>
using namespace std;
void test1()
{
    string line;
    char li[100];
    //cin.getline(line,1000)针对的是字符数组
    cin.getline(li,1000);
    cout<<li;
    getline(cin,line); 
    cout<<line<<endl;
    //cin.get()=getchar();
    //2.多组数据输入输出  EOF 
    while(cin>>n>>m) 
//{
//}   3.cin比scanf要慢  TLE   4.endl相较于\n有清空缓冲区的功能
//<iomanip>
// cout.setprecision()  有小数输出用c尽量不要用c++ 
}//bool up可读性
//动态开辟内存
//int *a=new int[100];  delete[] a;
//变常数数组 c可c++不可
//&实现了指针的某些功能
//int &a=number;
// int *a=&number;//简化指针  偶尔改变变量本身时用
//struct Node
//{};
//==c里的 
//typedef Node{
//}Node;
// 

 
 
int main()
{
    test1();
    test2();
}

void test2()
{
    //<vector> <string> <algorithm>
//<cstring>
//strlen() strcmp()  strcpy() 
//memset() 暴力清空 逐个字节填写 memset(str,0,sizeof(str));

//memset(str,0x3f3f3f3f,sizeof(str));
//memcpy() 暴力拷贝    
//<cmath> 三角函数 指数函数 浮点取整
//<cstdlib> qsort() c语言快排
//rand() 随机数 
//malloc free()  c语言动态分配内存
//<ctime>
//time(0) 从1970年到现在的秒数(配合随机数)
  srand(time(0))
//clock()程序启动到目前位置的毫秒数
int a=clock();

clock()-a; 
//<ctype>
//isdigit(),isalpha() 


<vector>向量->数组
vector<int> arr1(100);
int arr2[100];
vector<int> list;
list.push_back(1);
list.push_back(2);//既可以用下标访问 又可以像链表改变长度 
vector<int>::iterator p2;
for(p2=arr1.begin();p2!=arr1.end();p2++)
{
}
//vector常见操作
list.size();list.clear() o(n); list.empty();
list.erase(p1) o(n); list.push_back(1); list.pop_back();

//string
 string str1="hello";
 char str2[]="world";
 string str3;
 str3.push_back('!');//string和c语言字符串的关系和vector和普通数组的关系一样 
 cout<<str1<<" "<<str2<<" "<<str3<<endl;
 //
 string str="hello";
 str.length();str.size();//O(n)
 str.insert(1,"aaa");//O(n)
 str.insert(str.begin(),'a');//O(n)
 str.c_str();//返回c语言字符串 用于printf O(n) 返回char* 数组 
 str.append(str2);//str+=str2;        
 str.compare(str2);
 str==str2;strcmp(str,str2)==0;
 str+='a';//str.push+back('a')                                                                                                                                                         

algorithm


    //#include<algorithm> 
    //sort(arr,arr+n);    c
    //sort(arr.begin(),arr.end());  STL
    //for(vector<int>::iterator it=arr.begin();it!=arr.end();it++)
    //printf("%d",*it);
    
    
    int cmp(int a,int b)
    {
        return a<b;//升序 
    }
    //sort(arr.begin(),arr.end(),cmp)//第三个函数 排序的一句(可以放入比较函数) 
int main()
{
    int arr[3]={12,1,5};
    sort(arr,arr+3,cmp);
    for(int i=0;i<3;i++)
    cout<<arr[i]<<endl;
}
struct Point{
    int x,y;
};
Point points[1111];
bool cmp(Point a,Point b)
{
    if(a.x!=b.x)
    {
        return a.x<b.x;
    }
    return a.y<b.y;
}
//int main()
{
    sort(points,points+10,cmp);//自己定义的结构体一定要自己写函数 
}

运算符重载/函数

其他algorithm函数

//其他algorithm函数
 //最大最小值 min(1,2) max(1,2); O(1)
 //数组最大最小指针 O(n) 
 min_element(arr.begin(),arr.end());
 max_element(arr.begin(),arr.end());
 
 //把数组中第n小(从0开始算)的数放到第n个位置
 //类似快排 并且保证它左边的数比它小,右边的数比它大
 //O(n)
 nth_element(arr.begin(),arr.begin()+n,arr.end());
 //左乱序右乱序
  

    swap(arr[0],arr[1]);//O(1)
      reverse(arr.begin(),arr.end());//反转数组 O(n)
     //假设arr已经排好序
     //使arr中不出现重复的数字(去重)
     //返回去重后数组的结束指针
     //O(n)
     
     int newLength=unique(arr.begin(),arr.end())-arr.begin(); 
      //unique需要在sort之后使用 

//查找对应元素是否存在
    //O(logn)
    bool isExist=binary_search(arr.begin(),arr.end(),1);
    //两个函数都是在做一件事
    //如果把一个数插入有序数组 它应该插入到哪个位置
    //lower_bound返回第一个插入位置的指针,upper_bound返回一个位置的指针
    //O(logn)
    int firstLoc=lower_bound(arr.begin(),arr.end(),2)-arr.begin();//1
    int lastLoc=upper_bound(arr.begin(),arr.end()2,2)-arr.begin() ;//2
    

其他容器

set<int> st;
st.insert(1);
st.find(1);
st.erase(1);

mutiset<int> mst;
mst.insert(1);
mst.insert(1);
mst.count(1);//2

//<set>包含set(集合) mutiset(多重集)

//set用来保存很多很多元素 并能够在O(logn)的时间内查找 删除 添加某个元素

//迭代器的++和--能够在O(logn)的时间里找到第一个比它大(小)的数

//set自带去重 而mutiset允许元素重复 通过count可以获得某个元素的数量

//set是用某种平衡树实现的

<map>(映射)

pair<int,int> origin;//
//pair<string,int> pr{"小明",180};  比较 先比较第一个变量 再比较第二个
origin=make_pair(0,0);
origin.first==origin.second;
origin.swap;

pair<string,int>id;
id=make_pair("somebody",110);

//map包含的第一个数据结构是pair,它可以由任意两种类型构成
//当你偷懒不想写结构,又要用到两个相关联的变量时,可以用pair 
//pair自带了比较函数 默认先比第一个再比较第二个
pair<string,int> id;
id=make_pair("somebody",110);

map<string,int> studentHeight;//第一个为下标 第二个为数组值
studentHeight["小明"]=170;
studentHeight["小红"]=150;
studentHeight.insert(id);
studentHeight.erase("小明");

//map的第二个数据结构是map(映射)
map可以看成一个超级数组 你可以把字符串或者其他类型当成数组的下标
插入 查询 删除操作复杂度都是O(logn)
map内部使用了pair,所以你也可以通过inset一个pair来插入

map<string,int>height
{
{"1",1},
{"2",2}
};

bitset

bitset<1000> bst;

bst[0]=1;bit.set(0);
bit[0]=0;bst.reset(0);
bst<<1;bst>>1;bst^=1;bst&=1;
bst.count();
bst.to_string();
bst.to_ullong();

//说明:
bitset是一个只由0和1构成的数组 其占用空间较小
bitset不仅可以和数组一样用下标访问 还可以进行位运算

https://cplusplus.com/reference/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值