目次
コンテナの分類
実際の開発プロセスでは、データ構造自体の重要性はデータ構造を操作するアルゴリズムの重要性に劣らず、プログラムに時間を要する部分がある場合、データ構造の選択はさらに重要になります。 .
古典的なデータ構造の数は限られていますが, ベクトルや連結リストなどの構造を実装するために書かれたいくつかのコードを繰り返すことがよくあります. これらのコードは非常に似ていますが, 異なるデータの変化に適応するために詳細に違いがあります. STL コンテナはこのような便利さを提供してくれます. 既存の実装を再利用して特定の型の独自のデータ構造を構築することができます. いくつかのテンプレートを設定することにより, STL コンテナは最も一般的に使用されるデータ構造をサポートします. これらのテンプレート パラメータはコンテナー内の要素のデータ型を指定することで、反復的で退屈なタスクの多くを簡素化できます。
コンテナ部分は主にヘッダファイル <vector>, <list>, <deque>, <set>, <map>, <stack>, <queue> で構成されています。
シーケンス コンテナー
各要素には固定位置があります。要素の値とは関係なく、いつどこに挿入されるかによって決定されます。
ベクトル、両端キュー、リスト
関連コンテナ
要素の位置は、挿入順序とは関係なく、特定の並べ替え基準に依存します
セット、マルチセット、マップ、マルチマップ
データ構造 |
説明 |
ヘッダー ファイルを実装する |
ベクター |
連続して格納される要素 |
<ベクトル> |
リスト |
ノードで構成される双方向リンク リスト。各ノードには要素が含まれます。 |
<リスト> |
二重キュー (deque) |
異なる要素への連続して格納されたポインタの配列 |
<deque> |
設定 |
ノードで構成される赤黒ツリー。各ノードには要素が含まれます。ノードは、要素ペアに作用する述語によって配置されます。2 つの異なる要素が同じ順序を持つことはできません。 |
<セット> |
マルチセット |
等しい順序の 2 つの要素の存在を許可するセット |
<セット> |
スタック |
値の後入れ先出し順列 |
<スタック> |
列 |
先入れ先出し方式 |
<キュー> |
プライオリティ キュー (priority_queue) |
格納された値のペアに作用する何らかの述語によって要素の順序が決定されるキュー |
<キュー> |
地図 |
キーペアに作用するいくつかの述語で配置された {key, value} ペアのコレクション |
<地図> |
マルチマップ (マルチマップ) |
キーペアが同じ順序になるようにするマップ |
<地図> |
弦
文字列の概念
- string は STL の文字列型で、通常は文字列を表すために使用されます。string を使用する前は、通常、string は char* で表されます。string と char* の両方を使用して文字列を表すことができるため、2 つの違いは何ですか。
string と char* の比較
- string はクラスで、char* は文字へのポインタです。
String は char* をカプセル化し、この文字列を管理する、char* 型のコンテナです。
- 文字列は、メモリ解放と範囲外を考慮する必要はありません。
string は、char* によって割り当てられたメモリを管理します。文字列がコピーされるたびに、値は文字列クラスによって維持されるため、範囲外のコピーと範囲外の値について心配する必要はありません。
- string は一連の文字列操作関数を提供します
検索 検索、コピー コピー、削除 消去、置換 置換、挿入 挿入
文字列の初期化
文字列を初期化するには、主に 4 つの方法があります。
- デフォルトのコンストラクタ:
string(); //空文字列 string s1 を構築します。
- コピー コンストラクター:
string(const string &str); //str と同じ文字列を作成します。文字列 s1(s2) など。
- パラメータを持つコンストラクタ
string(const char *s); //文字列 s で初期化
string(int n,char c); //n 文字で初期化 c
void main21()
{
string s1 = "aaaa";
string s2("bbbb");
string s3 = s2;//通过拷贝构造函数来初始化对象
string s4(10, 'a');
cout << "s1:" << s1 << endl;
cout << "s2:" << s2 << endl;
cout << "s3:" << s3 << endl;
cout << "s4:" << s4 << endl;
}
文字列トラバーサル
文字列には主に 2 つの方法があります. 1 つは配列をトラバースする方法で、もう 1 つはイテレータをトラバースする方法です. 配列メソッドでエラーが発生した場合、例外はスローされませんが、イテレータはスローされます.
//string的遍历
void main22()
{
string s1 = "abcdefg";
//1 数组方式
for (int i = 0; i < s1.length(); i++)
{
cout << s1[i] << " ";//出现错误不向外面抛出异常引起程序的中断
}
cout << endl;
//2 迭代器
for (string::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
try
{
for (int i = 0; i < s1.length()+3; i++)
{
cout << s1.at(i) << " ";//抛出异常
}
}
catch (...)
{
cout << "发生异常\n";
}
cout << endl;
}
文字列の基本操作
char* 型と string 型の変換
const char *c_str() const; //'\0' で終わる文字列の最初のアドレスを返します。
//字符指针和string的转换
void main23()
{
string s1 = "aaabbb";
//1 s1===>char *
printf("s1:%s\n", s1.c_str());
//2 char *===>string
//3 s1的内容copy buf中
char buf[128] = { 0 };
s1.copy(buf, 3, 0);//注意 只给你copy3个字符 不会加\0
cout << "buf1:" << buf << endl;
}
文字列の連結
string &operator+=(const string &s); //文字列 s を現在の文字列の末尾に接続します
string &operator+=(const char *s);// 文字列 s を現在の文字列の末尾に接続します
string &append(const char *s); //文字列 s を現在の文字列の末尾に接続します
string &append(const char *s,int n); //文字列 s の最初の n 文字を現在の文字列の末尾に接続します
string &append(const string &s); //同演算子+=()
string &append(const string &s,int pos, int n);// 文字列 s の pos から始まる n 文字を現在の文字列の末尾に接続します
string &append(int n, char c); //現在の文字列の末尾に n 文字 c を追加します
//字符串的连接
void main24()
{
string s1 = "aaa";
string s2 = "bbb";
s1 = s1 + s2;
cout << s1 << endl;
string s3 = "333";
string s4 = "444";
s3.append(s4);
cout << s3 << endl;
}
文字列の検索と置換
見上げる
int find(char c,int pos=0) const; //pos から開始して、現在の文字列内の文字 c の位置を検索します
int find(const char *s, int pos=0) const; // pos から開始して、現在の文字列内の文字列 s の位置を検索します
int find(const string &s, int pos=0) const; // pos から開始して、現在の文字列内の文字列 s の位置を見つける
find 関数が見つからない場合は、-1 を返します。
int rfind(char c, int pos=npos) const; //現在の文字列内の文字 c の位置を pos から後ろから前に検索します
int rfind(const char *s, int pos=npos) const;
int rfind(const string &s, int pos=npos) const;
//rfind は逆引きを意味し、見つからない場合は -1 を返します
交換
string &replace(int pos, int n, const char *s);//pos から始まる n 文字を削除し、pos に文字列 s を挿入します
string &replace(int pos, int n, const string &s); //pos から始まる n 文字を削除し、pos に文字列 s を挿入します
void swap(string &s2); //現在の文字列と s2 の値を交換する
//字符串的查找和替换
void main25()
{
string s1 = "wbm hello wbm 111 wbm 222 wbm 333";
//查找第一次wbm index
int index = s1.find("wbm", 0);//位置下标从0开始
cout << "index:" << index << endl;
//求wbm出现的次数 每一次出现的数组下标
int offindex = s1.find("wbm", 0);
while (offindex!=string::npos)
{
cout << "offindex:" << offindex << endl;
offindex = offindex + 1;
offindex = s1.find("wbm", offindex);
}
//替换 把小写换成大写
string s3 = "aaa bbb ccc";
s3.replace(0, 3, "AAA");
cout << "s3:" << s3 << endl;
offindex = s1.find("wbm", 0);
while (offindex != string::npos)
{
cout << "offindex:" << offindex << endl;
s1.replace(offindex, 3, "WBM");
offindex = offindex + 1;
offindex = s1.find("wbm", offindex);
}
cout << "s1:" << s1 << endl;
}
文字列の切り捨てと削除
string &insert(int pos, const char *s);
string &insert(int pos, const string &s);
//最初の 2 つの関数は、位置 pos に文字列 s を挿入します
string &insert(int pos, int n, char c); //位置 pos に n 文字 c を挿入します
string &erase(int pos=0, int n=npos); //pos から n 文字を削除し、修正後の文字列を返す
//截断和删除
void main26()
{
string s1 = "hello1 hello2 hello1";
string::iterator it = find(s1.begin(), s1.end(), 'l');
while (it != s1.end())
{
s1.erase(it);
it = find(it, s1.end(), 'l');
}
cout << "s1:" << s1 << endl;
s1.erase(s1.begin(), s1.end());
cout << "s1:" << s1 << endl;
cout << "s1.length():" << s1.length() << endl;
string s2 = "BBB";
s2.insert(0, "AAA"); // 头插法
cout << "s2:" << s2 << endl;
s2.insert(s2.length(), "CCC");
cout << "s2:" << s2 << endl;
}
文字列アルゴリズム関連
文字列の大文字と小文字を変換する関数
void main27()
{
string s1 = "AAAbbb";
//函数的入口地址 函数对象 预定义的函数
transform(s1.begin(), s1.end(), s1.begin(), toupper);
cout << s1 << endl;
string s2 = "AAAbbb";
transform(s2.begin(), s2.end(), s2.begin(), tolower);
cout << s2 << endl;
}