コンテナ文字列の基本概念
一般的な操作容器文字列
の文字列少し練習
- 文字列のコンテナの基本的な考え方
- 複雑なマスターするのは難しすぎるCスタイルの文字列(文字列のヌル文字)は、大規模なプログラムの開発に適していない、++標準ライブラリCヘッダファイルに定義され、文字列クラスを定義する
-文字列と文字列の比較のCスタイル
charが文字列がクラスで、ポインタで、文字列は文字をカプセル化し、文字列の管理は、チャーである型容器。
文字列は、その上、このような発見発見として、使用されている方法の多くのメンバーをカプセル化し、コピーコピー、削除、削除、置き換え置き換え、挿入部を挿入して。
私たちは、文字列charが管理するメモリおよびクロスボーダーの解除を検討する必要があり、それぞれに文字列を割り当て、割り当てられたメモリを、文字列クラスによって文字列がメンテナンスのために責任がある、など、私たちは国境を越えたクロスボーダーの問題の値を割り当て心配しないで
、文字列の容器は、一般的なオペレーティング
-文字列のコンストラクタ
string();//创建一个空的字符串 例如: string str;
string(const string& str);//使用一个string对象初始化另一个string对象
string(const char* s);//使用字符串s初始化
string(int n, char c);//使用n个字符c初始化
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1("abcd");
char * p = "cdefg";
string s2(p);
string s3(s2);
string s4(4, 'a');
cout << s1 << " " << s2 << " " << s3 << " " << s4 << endl;
system("pause");
return EXIT_SUCCESS;
}
- 文字列の基本的な割り当て
string& operator=(const char* s);//char*类型字符串 赋值给当前的字符串
string& operator=(const string &s);//把字符串s赋给当前的字符串
string& operator=(char c);//字符赋值给当前的字符串
string& assign(const char *s);//把字符串s赋给当前的字符串
string& assign(const char *s, int n);//把字符串s的前n个字符赋给当前的字符串
string& assign(const string &s);//把字符串s赋给当前字符串
string& assign(int n, char c);//用n个字符c赋给当前字符串
string& assign(const string &s, int start, int n);//将s从start开始n个字符赋值给字符串
注意:コピーコンストラクタではなく、単純なシャローコピーよりも、私たちのディープコピーであるとき。
この時点で、私たちは、次のコードに注意する必要があります
string str = "abcd";
これは、これは私たちのコピーコンストラクタ代入されていません
- 文字列アクセス動作
char& operator[](int n);//通过[]方式取字符
char& at(int n);//通过at方法获取字符
ここで、[]の違いは、私たちの国境を越えた時に、あるat
例外をスローし、私たちはします[]
主張している直接プログラムがクラッシュします
- 文字列スプライシング操作
string& operator+=(const string& str);//重载+=操作符
string& operator+=(const char* str);//重载+=操作符
string& operator+=(const char c);//重载+=操作符
string& append(const char *s);//把字符串s连接到当前字符串结尾
string& append(const char *s, int n);//把字符串s的前n个字符连接到当前字符串结尾
string& append(const string &s);//同operator+=()
string& append(const string &s, int pos, int n);//把字符串s中从pos开始的n个字符连接到当前字符串结尾
string& append(int n, char c);//在当前字符串结尾添加n个字符c
- 文字列の検索と置換
int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找
int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置
int find(const char c, int pos = 0) const; //查找字符c第一次出现位置
int rfind(const string& str, int pos = npos) const;//查找str最后一次位置,从pos开始查找
int rfind(const char* s, int pos = npos) const;//查找s最后一次出现位置,从pos开始查找
int rfind(const char* s, int pos, int n) const;//从pos查找s的前n个字符最后一次位置
int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置
string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str
string& replace(int pos, int n, const char* s); //替换从pos开始的n个字符为字符串s
- 文字列比較演算
int compare(const string &s) const;//与字符串s比较
int compare(const char *s) const;//与字符串s比较
関数が戻る> 1、-1 <、リターン== 0を比較します。
大文字小文字を区別しない比較、辞書の参照配列、小さい前の行と比較した場合。
大文字Aは、小文字aより小さくなっています。
- 文字列の部分文字列
string substr(int pos = 0, int n = npos) const;//返回由pos开始的n个字符组成的字符串
- 文字列のイテレータが返す
こことの、新しい方法で導入C ++ 11にrbeginこれら2つのタイプの議論を始めましょう、
始めと終わりには、それは文字列の最初の要素の位置と最後の要素を指しています次の位置
rbeginは正確に引き裂くと、私たちは始めと終わりはの反対で
一般的に使用されるトラバーサル文字列、および横断するためのスコープと
文字列イテレータ実際のchar *ポインタは、私たちの文字列の下に格納さを指していますターゲットアドレスに対応
#include <iostream>
#include <string>
using namespace std;
int main(){
string s("asdhijhnf");
string::iterator it = s.begin();
string::iterator it2 = s.end();
while (it != it2){
cout << *it << " ";
it++;
}
cout << endl;
for (auto ch : s){
cout << ch << " ";
}
cout << endl;
system("pause");
return EXIT_SUCCESS;
}
- 文字列の挿入および削除操作
string& insert(int pos, const char* s); //插入字符串
string& insert(int pos, const string& str); //插入字符串
string& insert(int pos, int n, char c);//在指定位置插入n个字符c
string& erase(int pos, int n = npos);//删除从Pos开始的n个字符
- C列ポインタ型変換
const char* c_str();//c_str()是一个类的成员函数,其实就是返回类中封装的那个char*指针
チャーストリングクラスのコンストラクタの文字列型への変換は、charであることができる文字列に変換
文字列の暗黙的型変換C ++におけるへのconstのchar *が存在し、それが文字列の自動変換C_STRINGタイプに文字列オブジェクトが存在しません文字列型は、c_str()メンバ関数によって変換することができます。
- 文字列操作能力
- サイズ:有効な文字列の長さを返します。
- 長さ:文字列の有効長さを返します(これは(サイズです)、これは歴史から残された問題です。)
- 容量:スペースの合計サイズを返します。
- 空:文字列は、空の文字列である文字列が空の場合はtrueを返し、そうでない場合はfalseかどうかを判断します
- クリア:空の文字列
- リザーブ、:文字列の予備スペース
- リサイズ(N、チャーCH =「\ 0」):N個の有効な変化、CHを充填空間の複数回使用。
C ++文字列は、文字列ではなく、管理するユーザーが、大幅にオープンスペースとスペース消費の頻繁なリリースの独自の長さを制御することができます。プリセットの時間私たちは準備金を使用して私たちのスペースを行なうサイズを変更することができます
両方とも、違いのサイズを変更:サイズパラメータ文字列クラスが増加した。この時点で私たちの能力はメモリの割り当てに応じて、決定することができませんメカニズムは、割り当てのサイズを見てください。リザーブ:私たちの能力を向上させるために行われているが、私たちのサイズは変更されません。
//使用resize进行空间预留
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
s.resize(100);
for (int i = 0; i < s.size(); i++){
s[i] = 'a';
}
cout << "size=" << s.size() << endl;
cout << "capacity=" << s.capacity() << endl;
cout << s << endl;
system("pause");
return EXIT_SUCCESS;
}
ここで、容量は、我々は111リサイズ(111)のになった時です。
この説明は、私たちの入力パラメータと関連していないスペースをリセットすることはありませんが、いくつかの内部メモリ割り当てメカニズムがあります。それは私たちの頻繁なオープンスペースを削減することです。
使用しているときreserve
の時間を、私たちはであるため、使用に注意を払わなければならないreserve
時間はsize
変更されません。
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
s.reserve(100);
for (int i = 0; i < s.size(); i++){
s[i] = 'a';
}
cout << "size=" << s.size() << endl;
cout << "capacity=" << s.capacity() << endl;
cout << s << endl;
system("pause");
return EXIT_SUCCESS;
}
この時間は、サイズが変更されません
この場合、割り当ては、データ補間テールを実行するために一back()を使用して、変更されなければならないので
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
s.reserve(100);
for (int i = 0; i < 100; i++){
s.push_back('a');
}
cout << "size=" << s.size() << endl;
cout << "capacity=" << s.capacity() << endl;
cout << s << endl;
system("pause");
return EXIT_SUCCESS;
}
3.文字列を少し練習
- 文字にリバース
フリップ文字列を
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
cin >> s;
int i = 0;
int j = s.size() - 1;
while (i < j){
swap(s[i++], s[j--]);
}
cout << s << endl;
system("pause");
return EXIT_SUCCESS;
}
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
void blindst(string& str1, string& str2){
int flag = 0;
int i = 0;
for (; i < str1.length(); i++){
int sum = str1[i] - '0' + str2[i] - '0'+flag;//得到两个结果的和
str2[i] = (char)(sum % 10 + '0');
flag = sum / 10;
}
while (i < str2.length()){
int sum = (str2[i] - '0') + flag;
str2[i] = (char)(sum % 10 + '0');
flag = sum / 10;
i++;
}
if (flag != 0){
str2 += to_string(flag);
}
}
int main(){
string str1, str2;
cin >> str1 >> str2;
vector<string>v;
int ss = 1;
for (int i = str1.length() - 1; i >= 0; i--){
string s = "";
for (int j = i; j < str1.length() - 1; j++){
s += "0";
}
int flag = 0;
for (int j = str2.length() - 1; j >= 0; j--){
int x = (str2[j] - '0')*(str1[i] - '0') + flag;
int sul = (x ) % 10;
flag = x / 10;
s += to_string(sul);
}
if (flag != 0){
s += to_string(flag);
}
v.push_back(s);
}
//将所有的结果合并起来
for (int i = 0; i < v.size()-1; i++){//从第一个开始向后面合并
blindst(v[i], v[i + 1]);
}
for (int i = v[v.size() - 1].length() - 1; i >= 0; i--){
cout << v[v.size() - 1][i];
}
system("pause");
return EXIT_SUCCESS;
}