こんにちは。C++を学び始めました。
文法ミスでエラー出してハマることが多いので、テンプレを記録して困ったときはこれを見ます。
今回は、文字列周り。
参考:http://vivi.dyndns.org/tech/cpp/string.html#decl
2020/06/27 修正: @tyu_ru_cpp様のコメントよりアドレスのキャストに関し修正致しました
string_templete.cpp
#include <bits/stdc++.h>
using namespace std;
vector<string> split(const string &str, char sep);
// 文字列系
int main(){
string s; //空文字列で初期化
string str = "aiueo"; //初期化
string str_copy(str); //コピーコントラクタ
cout << str.size() << endl; //文字数
cout << str.length() << endl; //文字数
cout << str.capacity() << endl; //確保メモリ数
cout << (void*)&str[0] <<' '<< reinterpret_cast<uintptr_t>(&str[0]) << endl; //先頭アドレス(16進表示・10進表示)
cout << (void*)str.c_str() <<' '<< reinterpret_cast<uintptr_t>(str.c_str()) << endl; //先頭アドレス(16進表示・10進表示)
cout << (void*)str.data() <<' '<< reinterpret_cast<uintptr_t>(str.data()) << endl; //先頭アドレス(16進表示・10進表示)
cout << str.front() << ' ' << str[0] <<endl; //先頭文字
cout << str.back() << ' ' << str[str.size()-1] << endl; //末尾文字
str.push_back('k'); cout << str << endl; //末尾に文字を追加
str.pop_back(); cout << str << endl; //末尾の文字を削除
cout << str.substr(2, 2) << endl; //文字列切り出し(開始位置番号, 切り出し長)
str_copy.clear(); cout << str_copy << endl; //文字列を空にする
cout << str_copy.empty() << ' ' << (str_copy == "") << endl; //空判定;
string str_num = "12345"; cout << atoi(str_num.c_str()) << endl; //文字列整数をintに変換
str.resize(3); cout << str.size() <<' '<< str << endl; //文字列を一定長さにする(はみ出た分はカット)
str.resize(8,'a'); cout << str.size() <<' '<< str << endl; //文字列を一定長さにする(余りの部分を文字で埋める)
str.reserve(1000); cout << str.capacity() << endl; //高速化の為に先に十分なメモリを確保
str.shrink_to_fit(); cout << str.capacity() << endl; //余分なメモリを開放
string a="a", b= "b"; a.swap(b); cout <<"a:"<< a <<" b:"<< b <<endl; //文字列同士を交換
str="aiueoaiueo"; cout << (int)str.find("ue") << endl; //文字列内の文字列を検索し位置を返す
str="aiueoaiueo"; cout << (int)str.find("ue",5) << endl; //文字列内の指定位置から文字列を検索し位置を返す
str="aiueoaiueo"; cout << (int)str.rfind("ue") << endl; //文字列内の文字列を先頭方向に検索し位置を返す
str="aiueoaiueo"; cout << (int)str.rfind("ue",5) << endl; //文字列内の指定位置から先頭方向に文字列を検索し位置を返す
str="aiueo"; cout << str.replace(1,2,"xyz") << endl; //指定位置から文字数だけ置換文字列で置換する(指定位置,置換対象文字数,置換文字列)
string num = to_string(123.456); cout << num << endl; //整数や浮動小数点数を文字列に変換
vector<string> strvec; //文字列の配列の宣言
vector<string> strVec = {"abc", "123", "xyz"}; cout << strVec[0] << endl; //文字列の配列をリテラルで初期化
list<string> strList = {"abc", "123", "xyz"}; auto itr = strList.begin(); cout << *itr << endl; //listによる文字列の配列
//split関数(下記定義): 指定区切り文字で文字列を分割し配列に
vector<string> vec = split("abcdefg", 'd'); for(int i=0; i<vec.size(); i++) cout << vec[i] << ", "; cout<<endl;
return 0;
}
//split関数(下記定義): 指定区切り文字で文字列を分割し配列に
vector<string> split(const string &str, char sep){
vector<string> v; // 配列の空箱
stringstream ss(str);
string buffer;
while(getline(ss, buffer, sep)) v.push_back(buffer);
return v;
}
/*------------------実行結果--------------------
5
5
15
0x61fe00 6422016
0x61fe00 6422016
0x61fe00 6422016
a a
o o
aiueok
aiueo
ue
1 1
12345
3 aiu
8 aiuaaaaa
1000
15
a:b b:a
2
7
7
2
axyzeo
123.456000
abc
abc
abc, efg,
*/