1560 - 文字列の使い方(string)

時間制限 1 秒 / メモリ制限 64 MB / 得点 1 / Writer syoribu / x 2 / 統計 /


TLE
1sec
MLE
64MB
得点
1

string型は文字列を扱う型(C言語で言うchar型配列)です。
C++では文字列は、基本的にこの型を使うことになります(脱char型配列だね)。
char型配列とは異なり、文字列の代入や結合、比較に演算子を使うことができます。
ポインタを使った芸当はできませんが、同じような処理が関数として用意されています。
C言語に無かった便利な文字列操作の関数も多数あります(便利だね)。
ちなみに、scanf,printf関数に対応していません。

宣言方法

string s1;
string s2 = "Hello string!";
string s3 = {'a','b','c'};  //s3="abc"
string s4 = {};             //s4=""

基本の宣言方法はchar型配列とあまり変わりません。
しかし、宣言の時点で文字列の文字数気にする必要が無いため、
いつでもどこでもだれとでも宣言出来ます(嬉しいね)。

基本操作

代入演算子

string s;
s = "helloworld";         //文字列の直接代入可
s = 's';                  //文字の代入可
string subs = "hellworld";
s = subs;                 //他のstring型からの直接代入可
楽になったね

加算演算子

string s = "Hell";
string subs = "World";
s = s + subs;         //s = "HellWorld"
subs += s;            //subs = "WorldHellWorld"
減算は無いよ

比較演算子

string s = "Helo";
string subs = "Help";
if(s == subs) cout<<"true\n";//HeloとHelpは違う文字列なのでfalse
else cout<<"false\n";

if(s != subs) cout<<"true\n";//HeloとHelpは違う文字列なのでtrue
else cout<<"false\n";

if(s < subs) cout<<"true\n"; //HeloとHelpは辞書順だと
else cout<<"false\n";        //Heloの方が早いのでtrue

if(s <= subs) cout<<"true\n";//HeloとHelpは辞書順だと
else cout<<"false\n";        //Heloの方が早いのでtrue

if(s > subs) cout<<"true\n"; //HeloとHelpは辞書順だと
else cout<<"false\n";        //Heloの方が早いのでfalse

if(s >= subs) cout<<"true\n";//HeloとHelpは辞書順だと
else cout<<"false\n";        //Heloの方が早いのでfalse
不等号は使った覚えが無いよ

文字取得方法

string s = "Hell";
char c = s[1];    //c = 'e'
s[3] = c;         //s = "Hele"
char型配列と変わらんよ

よく使う関数群(1群)

文字列の長さ取得

size()
string s;
s = "helloworld";
cout<<s.size();  //=10
一番出番の多いメンバ関数
string以外でもよく使うよ

ソート

sort()
//昇順ソート
string s = "HellWorld";
sort(s.begin(),s.end());  //HWdelllor
//降順ソート
string c = "HellWorld";
sort(c.rbegin(),c.rend());//rollledWH
文字列を文字コード順でソートするよ
同じ文字をまとめたい時とかにも使うよ
begin()、end()とかが分からなければ、2年生の部長に聞いてね
O(N logN)

行入力

getline()
string s;
getline(cin,s);
改行されるまでの文字列を入力するよ
これを使うと空白も入力できるよ
ちなみにほぼ使わないよ
でもこれを知らないと実質解けない問題があったりするよ

あまり使わない関数群(2群)

文字列の挿入

insert()
string s1 = "ABCDE";
s1.insert(2,"12345");                       //s1 = "AB12345CDE"
//s1の2文字目に"12345"を挿入
string s2 = "ABCDE";
s2.insert(2,"12345",2,3);                   //s2 = "AB345CDE"
//s2の2文字目に"12345"の2文字目から3文字分を挿入
string s3 = "ABCDE";
s3.insert(2,"12345",3);                     //s3 = "AB123CDE"
//s3の2文字目に"12345"の前から3文字を挿入
string s4 = "ABCDE";
string s5 = "123";
s4.insert(s4.begin(),s5.begin()+2,s5.end());//s4 = "345ABCDE"
//s4の先頭の前にs5の先頭より二つ先から末尾までの範囲の文字列を挿入する。
すごく便利だよ。(使う機会があれば)

検索

find()
string s1 = "ABCDEABCDE";
cout<<s1.find("DE");   //=3(最初に見つけた要素)
cout<<s1.find('B');    //=1(最初に見つけた要素)
cout<<s1.find("DE",5); //=8(5文字目以降で最初に見つけた要素)
戻り値は数値だよ
さっきのよりは使いどころあるよ(多分ね)

置換

replace()
string s1 = "ABCDEABCDE";
s1.replace(1,2,"abcd");              //s1 = "AabcdDEABCDE"
//s1の1文字目から2文字目までを文字列"abcd"に置換する。
string s2 = "ABCDEFG";
string s3 = "CD";
s2.replace(s2.find(s3),s3.size(),"");//s2 = "ABEFG"
//s2の文字列s3が最初にあった場所からs3のサイズ分を""に置換する。
単体だと使い道が思いつかんよ
find()と組み合わせれば最低限の仕事はできるけどそれでも使った覚えが無いよ
良い使い方募集中

部分文字列作成

substr()
string s = "ABCDEFGHIJ";
cout<<s.substr(5);  //="FGHIJ"(5文字目以降の部分文字列)
cout<<s.substr(5,3);//="FGH"(5文字目以降から3文字分の部分文字列)
2群の中で一番使う(と思う)よ

順列作成

next_permutation()
string s1 = "ABCDEFGHIJ";
next_permutation(s1.begin(),s1.end());//= "ABCDEFGHJI"
//文字列s1の次の順列を作成する

string s2;
cin>>s2;
sort(s2.begin(),s2.end());
while(cout<<s2<<'\n',next_permutation(s2.begin(),s2.end()));
//入力した文字列の文字から出来る全ての順列を出力するプログラム
問題によってはこの関数を使うだけで完結する程度の利便性
戻り値は次の順列が作成可能ならtrue、不可能ならfalseを返すから
二つ目みたいな使い方も出来るよ
ちなみにPCKの予選問題?で使ったよ
でもそれ以外で使った覚えがないよ

prev_permutation()
string s1 = "ABCDEFGHJI";
prev_permutation(s1.begin(),s1.end());//= "ABCDEFGHIJ"
//文字列s1の前の順列を作成する
調べて初めて知ったよ

順列かの判定

is_permutation()
string s1 = "ABCDEFGHIJ";
string s2 = "ACEGIBDFHJ";
string s2 = "ACEGIBDFHH";
cout<<is_permutation(s1.begin(),s1.end(),s2.begin());//true
//s1はs2の文字列の並べ替えで作れる文字列のためtrue
cout<<is_permutation(s1.begin(),s1.end(),s3.begin());//false
//s1はs3の文字列の並べ替えで作れない文字列のためfalse
良い使い方募集中

文字列の不一致箇所判定

mismatch()
string s1 = "ABCDEFGHIJ";
string s2 = "ABCDEFGHII";
cout<<mismatch(s1.begin(),s1.end(),s2.begin());//= 9
二つの文字列の一致しない場所を教えてくれるよ
使いどころは必ずある(はずだ)よ

問題

など無い

お願い

syoribu(Admin)アカウントをお持ちの強者様。
好きに書き換えて良いので、情報の追加と更新よろしくお願いします。