2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C++備忘録:文字列に関する色々

Last updated at Posted at 2020-06-26

こんにちは。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,
*/
2
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?