美文网首页计算机上级复试资料
3. 入门并实践STL——string篇

3. 入门并实践STL——string篇

作者: zju_dream | 来源:发表于2019-03-01 12:44 被阅读0次

    string

    1. how to use?
    #include<string>
    using namespace std;
    
    1. string的定义

      • string str;
      • 初始化,string str = "abc";
    2. string的输入与输出

    3. string中内容的访问

      1. 通过下标:str[1]
      2. 通过迭代器访问
        • 一般使用第一种即可满足访问要求,但是有些函数比如insert()erase()要求以迭代器为参数
        • string::iterator it = str.begin();
      3. string和vector一样,支持直接对迭代器进行加减某个数字,如str.begin() + 3的写法是可行的。
    4. 常用函数解析

      1. operator+=: 将两个string直接拼接起来

      2. compare operator: 用于比较大小,比较规则是字典序

        1. ==
        2. !=
        3. <
        4. <=
        5. >
        6. >=
      3. size()length(): 存放的字符数,O(1)

      4. insert(), O(n)

        1. insert(pos, string): 在pos位置插入字符串string。例:str.insert(1, "xy"); // 在str[1]处插入,str变成axybc
        2. insert(it, it2, it3);: it为原字符串插入的位置,it2和it3为需插入字符串的首尾地址。
      5. erase()

        1. 删除单个元素: str.erase(it);
        2. 删除一个区间内的所有元素: str.erase(first, last), 删除[first, end)
        3. 时间复杂度都为O(n)
      6. clear(), O(1)

      7. substr(): subtr(pos, len); 返回从pos号开始,长度为len的字串,O(len)

      8. string::npos: 值为-1,用以作为find函数失配时的返回值。

      9. find():

        1. str.find(str1);,当str1时str的字串时,返回str中第一次出现的位置,如果str2不是str的字串则返回string::npos
        2. str.find(str1, pos); 从pos号位开始匹配str2
        3. 时间复杂度:O(nm), n和m为两个字符串的长度。
      10. replace()

        1. str.replace(pos, len, str2);
        2. str.replace(it1, it2, str2);: 把[it1, it2)范围的字串替换成str2
        3. 时间复杂度:O(str.length())

    习题

    Are they euqal

    • 解析
      1. 数字的形态可分为
        1. 0.abc...
        2. abcd(...).qwe
      2. 剔除前导0,查找'.'的位置,记录指数的大小,删除".",第一个非零位的0全部删除(小数)
      3. 整理后的字符串,长度不够补长度,长度够了进行截断。
    #include<iostream>
    #include<string>
    using namespace std;
    int N;
    string deal(string str, int& e) {
        while(str.length() > 0 && str[0] == '0') {
            str.erase(str.begin());
        }
        // str is less than 1
        if(str[0] == '.') {
            str.erase(str.begin());
            while(str.length() > 0 && str[0] == '0') {
                str.erase(str.begin());
                e--;
            }
        }
        //str is larger than 1
        else {
            // to find '.'
            int k = 0;
            while(k < str.length() && str[k] != '.') {
                k++;
                e++;
            }
            // it means we find '.', then we delete it.
            if(k != str.length()) {
                str.erase(str.begin() + k);
            }   
        }
        int len = str.length();
        if(len == 0) e = 0;
        while(len++ < N) {
            str += "0";
        }
        str = str.substr(0, N);
        return str;
        
    }
    
    int main() {
        
        scanf("%d", &N);
        // the input is too large, so we can't use integer to store them.
        // 
        string a, b;
        cin >> a >> b;
        int e1 = 0;
        int e2 = 0;
        a = deal(a, e1);
        b = deal(b, e2);
        if(a == b && e1 == e2) {
            printf("YES 0.%s*10^%d\n", a.c_str(), e1);
        }
        else {
            printf("NO 0.%s*10^%d 0.%s*10^%d\n", a.c_str(), e1, b.c_str(), e2); 
        }
        system("pause");
        return 0;
    }
    
    

    相关文章

      网友评论

        本文标题:3. 入门并实践STL——string篇

        本文链接:https://www.haomeiwen.com/subject/fwcduqtx.html