zoukankan      html  css  js  c++  java
  • C++STL小结

    1、vector——变长数组

    倍增的思想

    计算机申请空间的特点:花费时间与申请的大小无关,与申请速度有关(也就是和申请次数有关:申请1000个长度为1的空间花费时间可能是申请1个长度为1000的空间花费时间的1000倍)

    //基本函数
    vector<int> b;
    
    b.size();//返回元素个数
    b.empty();//判空
    b.claer();//清空
    front()/back(); //
    push_back()/pop_back();
    begin()/end();
    []支持随机存储
    支持比较运算(按字典序比较)
    
    #include <iostream>
    #include <cstdio>
    #include <csting>
    #include <vector> 
    
    using namespace std;
    
    int main()
    {
        //初始化
        vector<int> b(10, 3);
        //遍历方式1
        for(auto k:b) cout << k << endl;
        
        //用法
        vector<int> a;
     	
        for(int i = 0; i < 10; i++) a.push_back(i);
        //遍历方式2
        for(int i = 0; i < a.size(); i++) cout << a[i] << ' ';
        cout << endl;
        //遍历方式3
        for(vactor<int>::iterator i = a.begin(); i != a.end(); i++) cout << *i << ' ';
        cout << endl;
        
    }
    

    pair<T, T > —— 定义二元组

    pair<T, pair<T, T>> ——定义三元组

    //基本用法
    first
    second
    支持比较(以first为第一关键字,以second为第二关键字,字典序)
        
    pair<int, string> a;
    //两种
    a = make_pair(10, "abc");
    a = {10, "abc"};
    

    2、string——字符串

    #include <iostream>
    #include <string>
    
    using namespace std; 
    
    int main ()
    {
    	std::string s0 ("Hello World");  //根据已有字符串构造新的string实例
    	
    	//字符串长度 
    	cout << "字符串长度:" << endl; 
    	std::string s("1234567");
    	std::cout << "size=" << s.size() << std::endl;
    	std::cout << "length=" << s.length() << std::endl;     //size()和length():返回string对象的字符个数,他们执行效果相同。
    	if(s[8] == '')
    		std::cout << "yes" << std::endl;                   //数组越界访问,后一个为'',但在计算长度时会忽略'' 
    	std::cout << "max_size=" << s.max_size() << std::endl; //max_size():返回string对象最多包含的字符数,超出会抛出length_error异常
    	std::cout << "capacity=" << s.capacity() << std::endl; //capacity():重新分配内存之前,string对象能包含的最大字符数
    	
    	//C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),按照自左到右,按字典序比较
    	cout << "字符串比较:" << endl; 
    	string A("aBcdef");
    	string B("AbcdEf");
    	string C("123456");
    	string D("123dfg");
    	int m = A.compare(B);        //将A、B比较 
    	int n = A.compare(1, 5, B);  //A的字串从1开始包含5个(Bcdef), 与B比较 
    	int p = A.compare(1, 5, B, 4, 2);  //A的字串(Bcder),与B的字串(Ef) 
    	int q = A.compare(0, 3, "abcd", 3);  //A的字串(aBc),与"abcd"的子串,前3个(123),不能是字符数组名 
    	cout << "m=" << m << endl;    //1
    	cout << "n=" << n << endl;    //1
    	cout << "p=" << p << endl;    //-1
    	cout << "q=" << q << endl;    //-1    1大, -1小, 0等于 
    
    	//字符串初始化 
    	cout << "字符串初始化:" << endl; 
    	std::string s1;		//默认初始化,s1是个空字符串;
    	std::string s2(s0);	//通过复制一个string构造一个新的string
    	std::string s3(s0, 8, 3);//通过复制一个string的一部分来构造一个新的string。8为起始位置,3为偏移量。
    	std::string s4 ("A character sequence"); //与s0构造方式相同。 
    	std::string s5 ("Another character sequence", 12); //已知字符串,通过截取指定长度来创建一个string 
    	std::string s6a (10, 'x'); //指定string长度,与一个元素,则默认重复该元素创建string 
    	std::string s6b (10, 42); // 42 is the ASCII code for '*'  //通过ASCII码来代替s6a中的指定元素。 
    	std::string s7 (s0.begin(), s0.begin()+7); //通过迭代器来指定复制s0的一部分,来创建s7
    	
    	std::cout << "s1: " << s1 << "
    s2: " << s2 << "
    s3: " << s3; 
    	std::cout << "
    s4: " << s4 << "
    s5: " << s5 << "
    s6a: " << s6a; 
    	std::cout << "
    s6b: " << s6b << "
    s7: " << s7 << '
    ';
    	
    	//字符串更改
    	cout << "字符串更改:" << endl; 
    	string str7("123456");
    	string str;
    	str.assign(str7);             //将str7赋给str 
    	cout << str << endl;
    	str.assign(str7, 3, 3);       //str7从3开始3个(456)赋给str 
    	cout << str << endl;
    	str.assign(str7, 2, str7.npos); //str7从2开始到末尾(3456)赋给str 
    	cout << str << endl;
    	str.assign(5, 'X');            //把5个X赋给str 
    	cout << str << endl;
    	/*string::iterator itB = str7.begin();   
    	string::iterator itE = str7.end();
    	str.assign(itB, --itE);
    	cout << str << endl << endl;*/   //迭代器
    	str.clear(); 
    	cout << str << endl;           //字符串清空s="";s.erase();
    	//尾部添加
    	cout << "尾部添加:" << endl; 
    	str += str7;
    	cout << str << endl;          //123456
    	str += "789";
    	cout << str << endl;          //123456789
    	str += 'a';
    	cout << str << endl;          //加1个字符, 123456789a
    	str.append(str7);
    	cout << str << endl;          //123456789a123456
    	str.append(str7,1,3);
    	cout << str << endl;		  //同前面的函数参数assign的解释(234),123456789a123456234
    	str.append(str7,4,string::npos);
    	cout << str << endl;		  //不解释了(56)  ,123456789a12345623456
    	str.append("000");
    	cout << str << endl;          //123456789a12345623456000
    	str.append("nico",5);
    	cout << str << endl;          //123456789a12345623456000nico
    	str.append(5,'x');
    	cout << str << endl;          //123456789a12345623456000nico xxxxx
    	str.push_back('a'); 
    	cout << str << endl;          //这个函数只能增加单个字符对STL熟悉的理解起来很简单 123456789a12345623456000nico xxxxxa
    	str.clear();
    	//插入
    	cout << "插入:" << endl; 
    	str.insert(0,"my name");
    	cout << str << endl;  
        str.insert(1,str7);       //从1位置开始插入 
        cout << str << endl; 
    	str.insert(6,1,'j');      //位置,个数,单个字符 
    	cout << str << endl; 
        //删除
        cout << "删除:" << endl; 
        str.replace(1,2,"nternationalizatio");
    	cout << str << endl; //从索引1开始的2个替换成后面的C_string
    	str.erase(13);
    	cout << str << endl; //从索引13开始往后全删除
    	str.erase(7,5);
    	cout << str << endl; //从索引7开始往后删5个
    	//提取字串及字符串连接(就是+)
    	cout << "提取:" << endl; 
    	str.assign("abcdefghijklmnopqrstuvwxyz");
    	string str1 = str.substr();
    	cout << str1 << endl; //返回s的全部内容
    	str1 = str.substr(11);
    	cout << str1 << endl; //从索引11往后的子串
    	str1 = str.substr(5,6);
    	cout << str1 << endl; //从索引5开始6个字符 
    	
    	//字符串查找
    	cout << "查找:" << endl; 
    	str.assign("1234567890");
    	int x = str.find("34", 0);
    	cout << x << endl;     //查找字符串(34)(也可查询单个字符),并返回第一个字符的索引。第二个参数为开始查找起始位置。若查询失败返回-1。
    	x = str.rfind("34");
    	cout << x << endl;     //逆向查找字符串(34)(也可查询单个字符),并返回第一个字符的索引。第二个参数为开始查找起始位置。若查询失败返回-1。
    	str.assign("1234563456340");
    	x = str.find_first_of("34"); 
    	cout << x << endl;     //查找字符串(34)(也可查询单个字符),并返回第一次出现的第一个字符的索引。若查询失败返回-1。
    	x = str.find_last_of("34");
    	cout << x << endl;     //查找字符串(34)(也可查询单个字符),并返回最后一次出现的第一个字符的索引。若查询失败返回-1。
    	x = str.find_first_not_of("34");
    	cout << x << endl;     //查找不是字符串(34)的字符串(也可查询单个字符),并返回第一次出现的第一个字符的索引。若查询失败返回-1。 
    	x = str.find_last_not_of("34");
    	cout << x << endl;     //查找不是字符串(34)的字符串(也可查询单个字符),并返回第一次出现的第一个字符的索引。若查询失败返回-1。 
    
    	return 0;
    }
    //Output: 
    //s1: 
    //s2: Initial string 
    //s3: str 
    //s4: A character sequence 
    //s5: Another char 
    //s6a: xxxxxxxxxx 
    //s6b: ********** 
    //s7: Initial
     
    

    3、queue——队列

    //基本用法
    size();
    empty();
    push(); //相队尾插入一个元素
    front(); //返回队头元素
    back(); //返回队尾元素
    pop(); //弹出队头元素
    

    4、priority_queue——优先队列(堆)

    默认是定义大根堆。

    //基本用法
    push(); //插入一个元素
    top(); //返回对顶元素
    pop(); //弹出堆顶元素
    
    //定义一个小根堆
    (push(-x);)
    
    priority_queue<int, vactor<int>, greater<int>> heap;
    

    5、stack——栈

    //基本用法
    size();
    empty();
    push(); //向栈顶插入一个元素
    top();  //返回栈顶元素
    pop();  //弹出栈顶元素
    

    6、deque——双端队列

    效率非常低

    //基本用法
    size();
    empty();
    clear();
    front();
    back();
    push_back()/pop_back();
    push_front()/pop_front();
    begin()/end();
    []支持随机存取
    

    7、set、map、multiset、multimap

    基于平衡二叉树(红黑树),动态维护有序序列

    //set(不能有重复的数)/multiset(允许有重复的数)
    size();
    empty();
    clear();
    begin()/end();  //++,--返回前驱和后继,时间复杂度O(logn)
    
    insert(); //插入一个数
    find(); //查找一个数,若不存在返回end()
    count(); //返回某一个数的个数
    erase();
    	(1)输入一个数x,删除所有x; O(k * logn)
    	(2)输入一个迭代器,删除这个迭代器
    lower_bound(); //返回大于等于x的最小的数的迭代器
    upper_bound(); //返回大于x的最小的数的迭代器
    
    //map/multimap
    //将一个参数映射为另一个参数
    size();
    empty();
    clear();
    begin()/end();
    
    insert(); //插入一个pair
    erase(); //输入参数是pair或者迭代器
    find();
    [] // O(logn)
    /* map<T1, T2> a[T1] = T2 */
    
    

    8、unordered_set、unordered_map、unordered_multiset、unordered_multimap

    基于哈希表

    和上面类似,增删改查操作时间复杂度为O(1)

    不支持lower_bound()和upper_bound(),迭代器的++、--

    9、bitset

    压位

    //初始化
    bitset<数量> s;
    支持所有的位运算:~、&、|、^、<<、>>、==、!=
    []
    count(); //返回有多少个1
    any(); //判断是否至少有一个1
    none(); //判断是否权威0
    
    set(); //把所有位置1
    reset(); //把所有位置0
    set(k, v); //将第k位变成v
    flip(); //等价于~
    flip(k); //把第k为取反
    
    
  • 相关阅读:
    8.电影推荐
    一.Memcached企业服务
    7.学完linux系统运维到底可以做什么?
    svn+jenkins自动部署
    关于gitlab+jenkins自动部署代码的实现
    Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre
    php实现雪花算法(ID递增)
    php使用rdkafka进行消费
    Burp破解安装(1.7和2.0)
    在已有lnmp环境的基础上安装PHP7
  • 原文地址:https://www.cnblogs.com/grain-rain/p/13492828.html
Copyright © 2011-2022 走看看