3. 入門並實踐STL——string篇

weixin_34308389發表於2019-03-01

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;
}

相關文章