zoukankan      html  css  js  c++  java
  • STL初学

    标准模板库STL初学

    线性数据结构

    vector

    一维向量,相当于数组

    list

    链表

    map

    映射,提供(Key,Value)式操作,相当于哈希表

    string

    char字符串

    queue

    队列,先入先出的线性表

    stack

    栈,先入后出的线性表

    set

    集合

    deque

    双向链表

    一、vector:对数组的封装

    push_back

    在尾部添加一个元素

    pop_back

    从尾部删除一个元素(capacity不变)

    clear

    清空所有元素(capacity不变)

    at

    按索引访问某个位置的元素(操作符[]也被重载,可以用)

    front / back

    返回头/尾元素的引用

    size

    返回元素个数

    capacity

    返回当前容量

    resize

    改变容量大小

    insert

    在中间插入元素(与普通数组一样,涉及移动,效率低)

    erase

    删除中间的元素(与普通数组一样,涉及移动,效率低)

    在能确定最大容量时,应直接指定,避免反复申请缓冲区和复制大段数据。即创建时vector<int> arr(128)

    迭代器iterator是vector的内部类,用于对vector内部的元素遍历。

    vector<int>::iterator iter;
    for(iter = arr.begin(); iter != arr.end(); iter++)

    其中,*和->操作符被重载,可以直接使用。

    二、list:对链表的封装

    push_back

    在尾部添加一个元素

    pop_back

    从尾部删除一个元素

    push_front

    在首部添加一个元素

    pop_front

    从首部删除一个元素

    clear

    清空所有元素

    front / back

    返回头/尾元素的引用

    size

    返回元素个数

    insert

    在中间插入元素(需要用迭代器遍历找到插入点)

    erase

    删除中间的元素(需要用迭代器遍历找到删除点)

    只进行push_back和pop_front,就相当于队列;只进行push_back和pop_back,就相当于栈。

    三、string:对字符串的封装

    内部仍然是维护一个char型数组,并且也是以0结尾。重载了许多操作符。

    append

    附加字符串

    clear

    清空

    capacity

    容量

    size / length

    两者相同,都返回实际长度

    at

    按索引访问字符(与重载操作符[]等效)

    find

    查找一个字符或一个子串

    rfind

    从后往前查找一个字符或一个子串

    find_first_of

    查找匹配若干字符串中的一个字符

    find_first_not_of

    查找不匹配若干字符串中的一个字符

    find_last_of

    从后往前查找,匹配若干字符串中的一个字符

    find_last_not_of

    从后往前查找,不匹配若干字符串中的一个字符

    substr

    取得一个子串

    insert

    插入字符或子串

    replace

    替换字符或子串

    构造对象:

    string str("abc");
    string str = "abc";
    string str("abcde", 5);
    string str;
    string str = "";

    可以用c_str函数来获取string内部的字符串指针:const char *str = str1.c_str();

    传参时,使用const string& 或 string&(传引用),一般不使用string(传值)

    附加字符串:(append函数和操作符)

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     string str;
     6     str.append("abc"); //附加字符串
     7     str.append("abcde",3); //附加字符串前3个字符
     8     str.append("abcde",1,3); //附加1-3个字符
     9     str.append(2,'h'); //附加2个h
    10     cout << str << endl; //abcabcbcdhh
    11     return 0;
    12 }

    重载操作符 +=,+:如str += "abc";

    和vector一样,当附加字符串时有可能会自动扩充缓冲区,并且需要复制原有数据。

    字符串比较(重载了关系操作符):

    string类重载了所有关系操作符(==, !=, >, >=, <, <=)。其概念与strcmp返回值相同。

    字符串查找:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     string str = "LiMing is doing homework";
     6     int pos1 = str.find('i'); //返回1
     7     int pos2 = str.find('i',2); //从位置2开始找,返回3
     8     int pos3 = str.find("ing"); //返回3
     9     int pos4 = str.find("ing",pos3+3); //以po3+3=6开始往后找
    10     int pos5 = str.rfind("ing"); //从右向左 返回12
    11     int pos6 = str.rfind("ing",pos5-3); //以pos5-3=9从右向左开始找,返回3
    12     int pos7 = str.find_first_of("aeiouAEIOU"); //返回第一个元音字母的位置 1
    13     int pos8 = str.find_first_not_of("aeiouAEIOU"); //返回第一个不是元音字母的位置 0
    14     int pos9 = str.find_last_of("aeiouAEIOU"); //返回从右向左找第一个是元音字母的位置 21
    15     int pos0 = str.find_last_not_of("aeiouAEIOU"); //返回从右向左找第一个不是元音字母的位置 23
    16     return 0;
    17 }

    复制子串(substr):

    string str = "abcdefg";
    string str1 = str.substr(4) //efg
    string str2 = str.substr(4,2); //ef

    插入和替换(低效):

    // insert 的使用
    string& insert(int pos, const char *str); //在pos处插入str
    string& insert(int pos, const char *str, int count); //在pos处插入str[0,count-1]
    string& insert(int pos, const char *str, int offset, int count); //在pos处插入str[offset,offset+count-1]
    string& insert(int pos, int count, char ch); //插入若干字符
    
    // replace 的使用,原串和用于替换的串的长度无关
    string& replace(int pos, int num, const char *dest); //替换原字符串[pos,pos+num-1]
    string& replace(int pos, int num, const char *dest, int count); //以dest[0,count-1]替换原字符串[pos,pos+num-1]
    string& replace(int pos, int num, const char *dest, int offset, int count); //以dest[offset,offset+count-1]替换原字符串[pos,pos+num-1]
    string& replace(int pos, int num, int count, char ch); //以count个ch替换原字符串[pos,pos+num-1]

    四、二分(180208补充):

    STL的二分函数返回值(迭代器)大概概括如下

    1 3 3 5 9

    lower_bound(3) -> a[1] -> 3

    upper_bound(3) -> a[3] -> 5

  • 相关阅读:
    c# 子窗体打开或者切换就最大化
    TreeView失去焦点时亮显选中状态
    解决 RecursionError: maximum recursion depth exceeded
    CentOS7安装jdk1.8
    CentOS7安装mysql5.7
    CentOS7安装redis3.2.3
    CentOS7安装nginx1.8
    centos7设置redis开机自启动
    Linux下执行sh脚本报错:$' ': command not found
    Linux下使用unhide查看隐藏文件
  • 原文地址:https://www.cnblogs.com/sandychn/p/8338301.html
Copyright © 2011-2022 走看看