C++stl模板

一    ​​​​​​vector

1.初始化

2操作

3重要操作

#include<iostream>
#include<vector>
using namespace std;
	vector<int>a(10,1);
int main(){

	vector<int>b(a);
	b[3]=7;//只能够对已存在的空间进行操作 
	for(int i=0;i<b.size();i++){
		cout<<b[i]<<endl;
	}
	cout<<"c  vector"<<endl;
	vector<int>c(b.begin(),b.begin()+5);
	for(int i=0;i<c.size();i++){
		cout<<c[i]<<endl;
	}
	cout<<"f  vector"<<endl;
	int d[3]={1,2,3};
	vector<int>f(d,d+3);
	for(int i=0;i<f.size();i++){
		cout<<f[i]<<endl;
	}
	return 0;
}
//a.back(); a.front(); a.clear(); a.empty(); a.pop_back(); a.push_back(); a.size(); a.insert(a.begin()+1,5);
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
	vector<int>a;
	for(int i=0;i<10;i++){
		a.push_back(i);
		
	}
	sort(a.begin(),a.end());
	reverse(a.begin(),a.end());
	find(a.begin(),a.end(),10);//没用上过 
	
	
	return 0;
}

二. sort

1.cmp

2.默认升序

  • 默认: 两个参数first,last,将[first, last)区间内元素升序排列。【注意区间为左闭右开】

  • 自定义排序: 需用户指定排序规则Compare comp,将 [first, last)区间内的元素按照用户指定的顺序排列。

  • #include<iostream>
    #include<vector>
    
    using namespace std;
    
    struct Student {    // 学生结构体
        string name;    // 学生姓名
        int grade;      // 学生分数
        Student();  // 无参数构造函数
        Student(string name, int grade) : name(name), grade(grade) {};  // 有参数构造函数
    };
    
    bool cmp(Student s1, Student s2) {  // 自定义排序
        if (s1.grade != s2.grade) {     // 如果学生成绩不同
            return s1.grade > s2.grade; // 则按照成绩降序排列
        }
        return s1.name < s2.name;   // 否则按照姓名升序排列
    }
    
    int main() {
        vector<Student> studs;
        studs.emplace_back("Bob", 80);
        studs.emplace_back("Ali", 90);
        studs.emplace_back("Ann", 85);
        studs.emplace_back("Liming", 90);
        studs.emplace_back("Trump", 79);
        studs.emplace_back("Fury", 58);
        studs.emplace_back("Jam", 62);
        studs.emplace_back("Lucy", 89);
    
        sort(studs.begin(), studs.end(), cmp);  // 排序
        for (int i = 0; i < studs.size(); i++) {    // 输出结果
            cout << studs[i].name << "\t" << studs[i].grade << endl;
        }
        return 0;
    }
    

    三.stack queue

  • 队列

  • push() 队尾插入一个元素
  • pop() 删除队列第一个元素
  • size() 返回队列中元素个数
  • empty() 如果队列空则返回true
  • front() 返回队列中的第一个元素
  • back() 返回队列中最后一个元素
  • #include<iostream>
    #include<queue>
    using namespace std;
    int main(){
    	queue<int>a;
    	a.push(1);
    	a.pop();
    	a.push(2);
    	cout<<a.size()<<endl;
    	if(a.empty())cout<<"B"<<endl;
    	cout<<a.front()<<endl;
    	a.push(5);
    	cout<<a.back()<<endl;
    	
    	return 0;
    }
    

  • push()
  • top()
  • pop()
  • empty()
  • size()
  • #include<iostream>
    #include<stack>
    using namespace std;
    int main(){
    	stack<int>a;
    	a.push(1);
    	a.pop();
    	a.push(2);
    	cout<<a.size()<<endl;
    	if(a.empty())cout<<"B"<<endl;
    	cout<<a.top()<<endl;
    	a.push(5);
    	cout<<a.top()<<endl;
    	a.push(8);
    	cout<<a.top()<<endl;
    	
    	return 0;
    }
    

    四 string

  • 1. C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较(如 str<”hello”)。  
    在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得 比较。字典排序靠前的字符小,  
    比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小(前面减后面)
    同时,string (“aaaa”) <string(aaaaa)。 
    ————————————————
    版权声明:本文为CSDN博主「YAIMZA」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_37941471/article/details/82107077
  • 2.push_back() insert()
  • 3.erase()
  • 4.find()
  • 5.sort()
  • void  test4()
    {
        string s1;
    
        // 尾插一个字符
        s1.push_back('a');
        s1.push_back('b');
        s1.push_back('c');
        cout<<"s1:"<<s1<<endl; // s1:abc
    
        // insert(pos,char):在制定的位置pos前插入字符char
        s1.insert(s1.begin(),'1');
        cout<<"s1:"<<s1<<endl; // s1:1abc
    }
    void test6()
    {
        string s1 = "123456789";
    
    
        // s1.erase(s1.begin()+1);              // 结果:13456789
        // s1.erase(s1.begin()+1,s1.end()-2);   // 结果:189
        s1.erase(1,6);                       // 结果:189
        string::iterator iter = s1.begin();
        while( iter != s1.end() )
        {
            cout<<*iter;
            *iter++;
        }
        cout<<endl;
    
    }
    void test7()
    {
        string s1("hello,world!");
    
        cout<<s1.size()<<endl;                     // 结果:12
        s1.replace(s1.size()-1,1,1,'.');           // 结果:hello,world.
    
        // 这里的6表示下标  5表示长度
        s1.replace(6,5,"girl");                    // 结果:hello,girl.
        // s1.begin(),s1.begin()+5 是左闭右开区间
        s1.replace(s1.begin(),s1.begin()+5,"boy"); // 结果:boy,girl.
        cout<<s1<<endl;
    }
    void test6()
    {
        string s1 = "123456789";
    
    
        // s1.erase(s1.begin()+1);              // 结果:13456789
        // s1.erase(s1.begin()+1,s1.end()-2);   // 结果:189
        s1.erase(1,6);                       // 结果:189
        string::iterator iter = s1.begin();
        while( iter != s1.end() )
        {
            cout<<*iter;
            *iter++;
        }
        cout<<endl;
    
    }
    void test8()
    {
        string s("dog bird chicken bird cat");
    
        //字符串查找-----找到后返回首字母在字符串中的下标
    
        // 1. 查找一个字符串
        cout << s.find("chicken") << endl;        // 结果是:9
    
        // 2. 从下标为6开始找字符'i',返回找到的第一个i的下标
        cout << s.find('i',6) << endl;            // 结果是:11
    
        // 3. 从字符串的末尾开始查找字符串,返回的还是首字母在字符串中的下标
        cout << s.rfind("chicken") << endl;       // 结果是:9
    
        // 4. 从字符串的末尾开始查找字符
        cout << s.rfind('i') << endl;             // 结果是:18-------因为是从末尾开始查找,所以返回第一次找到的字符
    
    
    }

    五. map unordered_map

  • 1.插入元素 pair make_pair 
  • 2.find() count()
  • 3.遍历
  • 4.一般来说 unordered_map的时间会更好
  • #include<iostream>
    #include<map>
    using namespace std;
    int main(){
    	map<int,string>mymap;
    	mymap[1]="nihao";
    	mymap.insert(make_pair(7,"haha"));
    	mymap.insert(pair<int,string>(4,"dddd"));
    	    map<int, string>::iterator iter;
    
        for(iter=mymap.begin(); iter!=mymap.end(); iter++) {
            cout<<iter->first<<": "<<iter->second<<endl;
        }
        iter=mymap.find(4);//
        if(iter!=mymap.end()){
        	cout<<"true"<<endl;
    	}
    	else cout<<"false"<<endl;
    	cout<<mymap.size()<<endl;
    	cout<<mymap.count(4)<<endl;
    	cout<<mymap.count(9)<<endl;
    	cout<<mymap.count(7)<<endl;
    	    for(iter=mymap.begin(); iter!=mymap.end();) {
            if (iter->second=="dddd") {
                mymap.erase(iter++);
            } else {
                iter++;
            }
        }
        mymap.erase(7);
        for(iter=mymap.begin(); iter!=mymap.end(); iter++) {
            cout<<iter->first<<": "<<iter->second<<endl;
        }
        /*for(int i=0;i<map.size();i++){
        	cout<<map[i]<<endl;
    	}*/ // 注意 map 和unordered_map都不可以用这种思路遍历 
    
        /*for(auto node: mymap) {
            cout<<node.first<<": "<<node.second<<endl;
        }*/
        //devc不支持 
    
    	
    	return 0;
    }

    六.set

  • set<int> q;     //以int型为例 默认按键值升序
    set<int,greater<int>> p;  //降序排列 
    int x;
    q.insert(x);    //将x插入q中
    q.erase(x);        //删除q中的x元素,返回0或1,0表示set中不存在x
    q.clear();        //清空q
    q.empty();        //判断q是否为空,若是返回1,否则返回0
    q.size();        //返回q中元素的个数
    q.find(x);        //在q中查找x,返回x的迭代器,若x不存在,则返回指向q尾部的迭代器即 q.end()
    q.lower_bound(x); //返回一个迭代器,指向第一个键值不小于x的元素
    q.upper_bound(x); //返回一个迭代器,指向第一个键值大于x的元素

    q.rend();          //返回第一个元素的的前一个元素迭代器
    q.begin();          //返回指向q中第一个元素的迭代器

    q.end();         //返回指向q最后一个元素下一个位置的迭代器
    q.rbegin();         //返回最后一个元素

     

    #include<iostream>
    #include<set>
    using namespace std;
    int main()
    {
    	set<int> q;   //默认按升序排列 
    	q.insert(5);
    	q.insert(5);
    	q.insert(5);
    	cout<<"q.size "<<q.size()<<endl;   //输出 1 ,在set插入中相同元素只会存在一个
    	
    	q.clear(); //清空set
    	cout<<"q.size "<<q.size()<<"\n\n";
    	
    	q.insert(4);
    	q.insert(4);
    	q.insert(3);
    	q.insert(3); 
    	q.insert(2);
    	q.insert(1);
    	
    	cout<<"lower_bound "<<*q.lower_bound(3)<<endl;  //返回3 
    	cout<<"upper_bound "<<*q.upper_bound(3)<<"\n\n";  //返回4 
    	
    	set<int>::iterator i;
    	for( i=q.begin();i!=q.end();i++)   //set的遍历 
    		cout<<*i<<" ";				   //输出1 2 3 4,可见自动按键值排序 
    	cout<<endl;
    	
    	q.erase(4);  //删除q中的 4 
    	
    	for(i=q.begin();i!=q.end();i++)  //再次遍历set 只输出 1 2 3 
    		cout<<*i<<" ";
    	cout<<"\n\n"; 
    	
    	
    	set<int,greater<int>> p;  //降序排列 
    	p.insert(1);
    	p.insert(2);
    	p.insert(3);
    	p.insert(4);
    	p.insert(5);
    	for(i=p.begin();i!=p.end();i++)
    		cout<<*i<<" ";
    	cout<<endl;
    	
    	return 0;
    }
    
    #include<iostream>
    #include<set>
    using namespace std;
    struct node{
    	int a,b;
    	bool operator< (const node W)const
    	{
    		return a>W.a;  //按a的值升序 
    	}
    }t;
    int main()
    {
    	set<node> q;
    	t.a=1;
    	t.b=2;
    	q.insert(t);
    	
    	t.a=4;
    	t.b=2;
    	q.insert(t);
    	
    	t.a=3;
    	t.b=5;
    	q.insert(t);	
    	
    	set<node>::iterator i;
    	for(i=q.begin();i!=q.end();i++)
    	{
    		t=*i;
    		cout<<t.a<<" "<<t.b<<endl;
    	}
    	return 0; 
    }
    

    七.priority_queue

  • 1.pop() push() size() top() empty()
  • 2.由于结构体默认是没有比较大小的功能的,所以也就不能直接使用优先级队列,需要重载运行符大于号和小于号,然后使用less<>和greater<>切换大小顶堆
  • 3.很多时候,我们不应该重载结构体的运算符。像数据结构vector,它有它的基本运算方法,我们不应该重载它的运算符。
    此时,我们就应该自定义结构体替代less<>和greater<>,通过重载括号符就可以更改比较规则
  • 4.一般来说用3不用2 并且第二种方法devc不兼容
  • #include<iostream>//c++标准头文件,可以使用cout,cin等标准库函数 
    #include<queue>//使用priority_queue时需要的头文件 
    using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,stack,map,set,vector,queue时都要使用
    struct test{//定义一个结构体test 
    	int val;
    	test(int v){//构造函数 
    		this->val=v;
    	}
    //	下面是基本的运算方法,我们不能随意更改它 
    	bool operator > (const test t)const{//重载运算符
    		return val>t.val;
    	}
    	bool operator < (const test t)const{//重载运算符
    		return val<t.val;
    	}
    };
    
    struct cmp{
    	bool operator () (const test t1,const test t2)const{//重载括号运算符
    		return t1.val<t2.val;//小于号是大根堆,大于号是小根堆 
    	}
    };
    int main(){
    	priority_queue<test,vector<test>,cmp> q;//自定义一个优先级队列q 
    	cout<<"自定义一个优先级队列q: priority_queue<test,vector<test>,cmp> q"<<endl; 
    	q.push(test(10));//向队列中添加一个test,val的值为10 
    	q.push(test(5));//向队列中添加一个test,val的值为5
    	q.push(test(7));//向队列中添加一个test,val的值为7
    	cout<<"q.top().val="<<q.top().val<<endl;
    	cout<<endl; 
    	
    	/*priority_queue<test,vector<test>,less<test>> q1;//定义一个大顶堆q1 
    	cout<<"定义一个大根堆q1: priority_queue<test,vector<test>,less<test>> q1"<<endl; 
    	q1.push(test(10));//向队列中添加一个test,val的值为10 
    	q1.push(test(5));//向队列中添加一个test,val的值为5
    	q1.push(test(7));//向队列中添加一个test,val的值为7
    	cout<<"按顺序添加val的值为10、5、7的test,目前队列的元素:test(10) test(5) test(7)" <<endl; 
    	cout<<"q1.top().val="<<q1.top().val<<endl;
    	cout<<endl; 
    	
    	priority_queue<test,vector<test>,greater<test>> q2;//定义一个大顶堆q1 
    	cout<<"定义一个小根堆q2: priority_queue<test,vector<test>,greate<test>> q2"<<endl; 
    	q2.push(test(10));//向队列中添加一个test,val的值为10 
    	q2.push(test(5));//向队列中添加一个test,val的值为5
    	q2.push(test(7));//向队列中添加一个test,val的值为7
    	cout<<"按顺序添加val的值为10、5、7的test,目前队列的元素:test(10) test(5) test(7)" <<endl; 
    	cout<<"q2.top().val="<<q2.top().val<<endl;
    	cout<<endl; 
    */
    
    	return 0;
    }
    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值