String

1. stringとは(復習)

stringとは文字列を扱う型です. 一文字だけを扱う型として, char というものがありましたが, 実は stringchar を複数文字扱えるように, 配列などを使用して管理している型ともいえます

例えば, c言語という言語には string 型が存在しないため, 配列を用いて実装しなければならなかったり…します

あと扱うのを忘れてたけど下記のように文字列を連結させることもできる

#include<bits/stdc++.h>
using namespace std;

int main() {
    string s = "hoge";
    string t = "fuga";
    string u = s + t;
    cout << u << endl;
}

2. stringを配列みたいに扱ってみる

#include<bits/stdc++.h>
using namespace std;

int main() {
    string hello = "Hello World";
    // こんな感じで文字列の特定の箇所にアクセスできる
    cout << hello[0] << hello[6] << endl;

    // 一文字を取り出して保存もできる
    char c1 = hello[0];
    char c2 = hello[6];

    cout << c1 << endl;
    cout << c2 << endl;

    // 文字列の一部を変更もできる
    string typo = "Hillo World";
    cout << typo << endl;

    typo[1] = 'e';
    cout << typo << endl;

    // daa
    string sudo = "subo sot upgrode";
    char hogehoge = 'd';
    char fugafuga = 'a';
    char hoehoe = 'p';
    sudo[2] = hogehoge;
    sudo[5] = fugafuga;
    sudo[6] = hoehoe;
    sudo[13] = fugafuga;
    cout << sudo[2] << sudo[5] << sudo[13] << endl;
}

3. stringで使える関数

string型には/string型を引数として取る関数にはいろんな種類があり, 適当に紹介します

substr : 部分文字列の切り出し

s.substr(開始位置, 文字数)

このような形式で文字列の一部(部分文字列)を取り出すことができます

競プロではある法則に乗っ取って文字列の一部を取り出したいなんてときに使います

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s = "AtCoder";
    cout << s.substr(0, 2) << endl; // At
    cout << s.substr(2, 4) << endl; // Code
    cout << s.substr(4, 3) << endl; // der
}

sort, reverseなど

string型は配列のように扱えるといっただけあり, vectorの学習でも出てきたsort関数なども同様に扱うことができます

#include<bits/stdc++.h>
using namespace std;

int main()
{
    string s = "Hello World";
    sort(s.begin(), s.end());
    cout << s << endl;

    string t = "desserts";
    cout << t << endl;
    reverse(t.begin(), t.end());
    cout << t << endl;
}

size()

string型の文字数を参照する関数です. vectorとかでも扱ってますが同じです

#include<bits/stdc++.h>
using namespace std;

int main()
{
    string s = "aaaa1024";
    cout << s.size() << endl;

    string t = "noyu38";
    cout << t.size() << endl;
}

4.1:stoi, stol:string型を数値型へ変換

型変換によっていろいろとうれしいことがあることがよくあるため, 教えます

string s = "123456";
int fig = stoi(s);
cout << fig * 2 << endl;

stoX 関数を使うことで, string型から各種数値型へと変換できます. Xの文字によって変換される型が変わります.

  • X=i:int型
  • X=l:long型
  • X=ll:long long型
  • X=d:double型
  • X=f:float型

4.2:char ↔︎ int の変換

char c = '5';
int  n = c - '0';   // 5  ('5'の文字コード - '0'の文字コード)

int  m = 7;
char d = '0' + m;   // '7'

とても不思議に感じると思うのですが,

// chat to int
char c = '<数字>';
int n = c - '0'

// int to char
int n = <数字>;
char c = '0' + n;

でchar型とint型の相互変換できます.

これは, 実はchar型が数値を受け取ることができることから説明していきます.

#include<bits/stdc++.h>
using namespace std;

int main()
{
    char c = 65;
    cout << c << endl;
    char d = 48;
    cout << d << endl;
}

これを実行すると,

A
0

なんて出力されます.

これはcharに限らずとも, string型などはASCIIコードとして管理されているためです

https://ja.cppreference.com/cpp/language/ascii

さて, それでは各char型数値に割り当てられているASCIIコードとしての値から, int型にしてあげるにはどうすればいいかというと,

!image.png

このように数値が並んでるため, <char数値> - ‘0’をしてあげれば変換ができると分かります.

逆のint型からchar文字へと変換するには, <int数値> + ‘0’とすれば変換ができます.


4.3:複数桁数の数値を文字列へと変換

to_stringという関数を使えばできます.

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n = 123;
    int m = 456;
    string s = to_string(n);
    string t = to_string(m);
    string u = s + t;
    cout << u << endl;
}

4.4:型変換ってどういうときに嬉しいのか?

主には, int型で基本は扱いたいけど, stringの機能を使いたい||stringで基本扱いたいけど, 一時的に数値計算したいというときに使えます.

例えば,

  • intをstringへと変換することで, 特定の桁数を参照するとか, 書き換えるとか, 別の数値を連結・削除できたりする
  • ↑の操作をしたときに戻す
  • 数値と文字が複雑に絡まっている文字列から一部を取り出す

なんかです

問題演習

https://atcoder.jp/contests/abc150/tasks/abc150_b

https://atcoder.jp/contests/abc172/tasks/abc172_b

https://atcoder.jp/contests/abc104/tasks/abc104_b

https://atcoder.jp/contests/abc427/tasks/abc427_a

https://atcoder.jp/contests/abc159/tasks/abc159_b

https://atcoder.jp/contests/abc080/tasks/abc080_b