序文
少し前に、ファンからの質問がありました。新入生の1年を終えた後、C++の基礎を勉強し終えました。習得すべきすべての知識ポイントを理解しましたか?基本を始めましたか?
数日前に、C++の基本的な入門知識ポイントとC++のコア高度な知識ポイントを整理しました。まだご覧になっていない方は、ぜひご覧ください。肝臓が破裂して一晩中起きていてください!C ++ Basic Introductory Collection [4D Dry Goods Warning Suggestion Collection]
一晩中起きて、肝臓を破裂させましょう!C++コアの高度な知識ポイントの要約
今日は、高度なC ++の記事でSTLコンテナ文字列の知識ポイントを整理し続けます。一緒に見てみましょう〜
以下の内容は、主にオンライン情報に基づいて編集および要約されています。侵害がある場合は、私にプライベートメッセージを送ってください。
1STLの概要
1.1STLの出現
-
ソフトウェア業界は常に再利用できるものを作りたいと思っていました
-
C ++のオブジェクト指向およびジェネリックプログラミングのアイデアは、再利用性の向上を目的としています。
-
ほとんどの場合、データ構造とアルゴリズムには一連の標準がないため、多くの反復作業が発生します
-
データ構造とアルゴリズムの標準を確立するために、 STLが登場しました
1.2STLの基本概念
- STL:標準テンプレートライブラリ
- STLは、主に次のように分類されます。コンテナ(コンテナ)アルゴリズム(アルゴリズム)イテレータ(イテレータ)
- イテレータを介して、コンテナとアルゴリズムの間にシームレスな接続があります。
1.3STLの6つの主要コンポーネント
STLは、大きく6つの主要なコンポーネントに分けられます。つまり、コンテナ、アルゴリズム、イテレータ、ファンクタ、アダプタ(アダプタ)、スペースコンフィギュレータです。
- コンテナ:データの格納には、vector、list、deque、set、mapなどのさまざまなデータ構造が使用されます。
- アルゴリズム:sort、find、copy、for_eachなどの一般的に使用されるさまざまなアルゴリズム。
- イテレータ:コンテナとアルゴリズムの間の接着剤として機能します。
- ファンクター:関数のように動作し、アルゴリズムの戦略として使用できる関数。
- アダプター:コンテナー、ファンクター、またはイテレーターのインターフェースを装飾するために使用されるもの。
- Space Configurator:スペースの構成と管理を担当します。
1.4 STLのコンテナ、アルゴリズム、およびイテレータ
STLコンテナは、最も広く使用されているデータ構造のいくつかを実装するためのものです
一般的に使用されるデータ構造:配列、リンクリスト、ツリー、スタック、キュー、セット、マッピングテーブルなど。
これらのコンテナは、シーケンシャルコンテナとアソシアティブコンテナの2つのタイプに分けられます。
シーケンスコンテナ:値の順序を強調し、シーケンスコンテナの各要素の位置は固定されています。
連想コンテナ:バイナリツリー構造、要素間に厳密な物理的順序関係はありません
アルゴリズム:論理的または数学的な問題を解決するための限られた数のステップ、この分野はアルゴリズムと呼ばれます
アルゴリズムは、定性的アルゴリズムと非定性的アルゴリズムに分けられます。
定性的変更アルゴリズム:間隔内の要素の内容が操作中に変更されることを意味します。コピー、置換、削除など。
不変アルゴリズム:検索、カウント、トラバース、極値の検索などの操作中に、区間内の要素の内容が変更されないことを意味します。
イテレータ:コンテナの内部表現を公開せずに、コンテナに含まれる要素に順番にアクセスする方法を提供します。各コンテナには独自のイテレータがあります。
イテレータの種類:
タイプ | 特徴 | サポート操作 |
---|---|---|
入力イテレータ | データへの読み取り専用アクセス | 読み取り専用、++をサポート、== 、! = |
出力イテレータ | データへの書き込み専用アクセス | 書き込みのみ、++をサポート |
フォワードイテレータ | 読み取りおよび書き込み操作、およびイテレータを進めることができます | 読み取りと書き込み、++のサポート、== 、! = |
双方向イテレータ | 読み取りおよび書き込み操作、および順方向と逆方向の操作が可能 | 読み取りと書き込み、++のサポート、–、 |
ランダムアクセスイテレータ | 読み取りおよび書き込み操作。ジャンプ方式で任意のデータにアクセスできます。これは最も強力なイテレータです。 | 読み取りと書き込み、++のサポート、–、[n]、-n、<、<=、>、> = |
一般的に使用されるコンテナのイテレータのタイプは、双方向イテレータとランダムアクセスイテレータです。
1.5コンテナアルゴリズムイテレータの概要
STLで最も一般的に使用されるコンテナはVectorです。これは配列として理解できます。このコンテナにデータを挿入し、このコンテナをトラバースする方法を見てみましょう。
1.5.1ベクトルは組み込みのデータ型を格納します
容器:vector
アルゴリズム:for_each
イテレータ:vector<int>::iterator
場合:
#include <vector>
#include <algorithm>
void MyPrint(int val)
{
cout << val << endl;
}
void test01() {
//创建vector容器对象,并且通过模板参数指定容器中存放的数据的类型
vector<int> v;
//向容器中放数据
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
//每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素
//v.begin()返回迭代器,这个迭代器指向容器中第一个数据
//v.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置
//vector<int>::iterator 拿到vector<int>这种容器的迭代器类型
vector<int>::iterator pBegin = v.begin();
vector<int>::iterator pEnd = v.end();
//第一种遍历方式:
while (pBegin != pEnd) {
cout << *pBegin << endl;
pBegin++;
}
//第二种遍历方式:
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << endl;
}
cout << endl;
//第三种遍历方式:
//使用STL提供标准遍历算法 头文件 algorithm
for_each(v.begin(), v.end(), MyPrint);
}
int main() {
test01();
system("pause");
return 0;
}
1.5.2ベクターはカスタムデータ型を格納します
場合:
#include <vector>
#include <string>
//自定义数据类型
class Person {
public:
Person(string name, int age) {
mName = name;
mAge = age;
}
public:
string mName;
int mAge;
};
//存放对象
void test01() {
vector<Person> v;
//创建数据
Person p1("aaa", 10);
Person p2("bbb", 20);
Person p3("ccc", 30);
Person p4("ddd", 40);
Person p5("eee", 50);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5);
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
cout << "Name:" << (*it).mName << " Age:" << (*it).mAge << endl;
}
}
//放对象指针
void test02() {
vector<Person*> v;
//创建数据
Person p1("aaa", 10);
Person p2("bbb", 20);
Person p3("ccc", 30);
Person p4("ddd", 40);
Person p5("eee", 50);
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
v.push_back(&p5);
for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++) {
Person * p = (*it);
cout << "Name:" << p->mName << " Age:" << (*it)->mAge << endl;
}
}
int main() {
test01();
test02();
system("pause");
return 0;
}
1.5.3ベクトルコンテナネストされたコンテナ
場合:
#include <vector>
//容器嵌套容器
void test01() {
vector< vector<int> > v;
vector<int> v1;
vector<int> v2;
vector<int> v3;
vector<int> v4;
for (int i = 0; i < 4; i++) {
v1.push_back(i + 1);
v2.push_back(i + 2);
v3.push_back(i + 3);
v4.push_back(i + 4);
}
//将容器元素插入到vector v中
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
v.push_back(v4);
for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) {
for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++) {
cout << *vit << " ";
}
cout << endl;
}
}
int main() {
test01();
system("pause");
return 0;
}
2STL-一般的なコンテナ
2.1文字列コンテナ
2.1.1文字列の基本概念
- stringはC++スタイルの文字列であり、stringは基本的にクラスです。
文字列と文字の違い*:
- char*はポインタです
- Stringは、char *をカプセル化し、この文字列を管理するクラスであり、char*タイプのコンテナです。
特徴:
文字列クラスは多くのメンバーメソッドをカプセル化します
例:検索検索、コピーコピー、削除削除置換置換、挿入挿入
Stringは、char *によって割り当てられたメモリを管理します。範囲外のコピーや範囲外の値などについて心配する必要はありません。これは、クラスが担当します。
2.1.2文字列コンストラクタ
コンストラクターのプロトタイプ:
string();
//空の文字列を作成します例:stringstr;
string(const char* s);
//文字列sで初期化しますstring(const string& str);
//1つの文字列オブジェクトで別の文字列オブジェクトを初期化しますstring(int n, char c);
//n文字で初期化c
場合:
#include <string>
//string构造
void test01()
{
string s1; //创建空字符串,调用无参构造函数
cout << "str1 = " << s1 << endl;
const char* str = "hello world";
string s2(str); //把c_string转换成了string
cout << "str2 = " << s2 << endl;
string s3(s2); //调用拷贝构造函数
cout << "str3 = " << s3 << endl;
string s4(10, 'a');
cout << "str3 = " << s3 << endl;
}
int main() {
test01();
system("pause");
return 0;
}
2.1.3文字列代入演算
機能の説明:
- 文字列に値を割り当てる
割り当てのための関数プロトタイプ:
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
場合:
//赋值
void test01()
{
string str1;
str1 = "hello world";
cout << "str1 = " << str1 << endl;
string str2;
str2 = str1;
cout << "str2 = " << str2 << endl;
string str3;
str3 = 'a';
cout << "str3 = " << str3 << endl;
string str4;
str4.assign("hello c++");
cout << "str4 = " << str4 << endl;
string str5;
str5.assign("hello c++",5);
cout << "str5 = " << str5 << endl;
string str6;
str6.assign(str5);
cout << "str6 = " << str6 << endl;
string str7;
str7.assign(5, 'x');
cout << "str7 = " << str7 << endl;
}
int main() {
test01();
system("pause");
return 0;
}
2.1.4文字列の連結
機能の説明:
- 文字列の最後に連結文字列を実装します
関数プロトタイプ:
string& operator+=(const char* str);
//+=演算子をオーバーロードしますstring& operator+=(const char c);
//+=演算子をオーバーロードしますstring& operator+=(const string& str);
//+=演算子をオーバーロードしますstring& append(const char *s);
//文字列sを現在の文字列の末尾に連結しますstring& append(const char *s, int n);
//文字列sの最初のn文字を現在の文字列の末尾に接続しますstring& append(const string &s);
//同演算子+=(const string&str)string& append(const string &s, int pos, int n);
// posで始まる文字列sのN文字は、文字列の末尾に連結されます
場合:
//字符串拼接
void test01()
{
string str1 = "我";
str1 += "爱玩游戏";
cout << "str1 = " << str1 << endl;
str1 += ':';
cout << "str1 = " << str1 << endl;
string str2 = "LOL DNF";
str1 += str2;
cout << "str1 = " << str1 << endl;
string str3 = "I";
str3.append(" love ");
str3.append("game abcde", 4);
//str3.append(str2);
str3.append(str2, 4, 3); // 从下标4位置开始 ,截取3个字符,拼接到字符串末尾
cout << "str3 = " << str3 << endl;
}
int main() {
test01();
system("pause");
return 0;
}
2.1.5文字列の検索と置換
機能の説明:
- 検索:指定された文字列が存在するかどうかを検索します
- 置換:指定された位置で文字列を置換します
関数プロトタイプ:
int find(const string& str, int pos = 0) const;
// posから始めて、strの最初の出現を検索しますint find(const char* s, int pos = 0) const;
// posから始めて、sの最初の出現を検索しますint find(const char* s, int pos, int n) const;
//位置からsの最初のn文字の最初の位置を検索しますint find(const char c, int pos = 0) const;
//文字cの最初の出現を検索しますint rfind(const string& str, int pos = npos) const;
// posから始めて、strの最後の位置を見つけますint rfind(const char* s, int pos = npos) const;
// posから始めて、sの最後の出現を検索します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文字をstringstrに置き換えますstring& replace(int pos, int n,const char* s);
//posから始まるn文字をstringsに置き換えます
場合:
//查找和替换
void test01()
{
//查找
string str1 = "abcdefgde";
int pos = str1.find("de");
if (pos == -1)
{
cout << "未找到" << endl;
}
else
{
cout << "pos = " << pos << endl;
}
pos = str1.rfind("de");
cout << "pos = " << pos << endl;
}
void test02()
{
//替换
string str1 = "abcdefgde";
str1.replace(1, 3, "1111");
cout << "str1 = " << str1 << endl;
}
int main() {
//test01();
//test02();
system("pause");
return 0;
}
2.1.6文字列文字列の比較
機能の説明:
- 文字列間の比較
比較方法:
- 文字列比較とは、文字のASCIIコードで比較することです。
=0を返します
>1を返す
<リターン-1
関数プロトタイプ:
int compare(const string &s) const;
//文字列と比較しますint compare(const char *s) const;
//文字列と比較します
場合:
//字符串比较
void test01()
{
string s1 = "hello";
string s2 = "aello";
int ret = s1.compare(s2);
if (ret == 0) {
cout << "s1 等于 s2" << endl;
}
else if (ret > 0)
{
cout << "s1 大于 s2" << endl;
}
else
{
cout << "s1 小于 s2" << endl;
}
}
int main() {
test01();
system("pause");
return 0;
}
2.1.7文字列アクセス
文字列内の1つの文字にアクセスする方法は2つあります
char& operator[](int n);
//[]メソッドで文字を取得char& at(int n);
//atメソッドで文字を取得します
例:
void test01()
{
string str = "hello world";
for (int i = 0; i < str.size(); i++)
{
cout << str[i] << " ";
}
cout << endl;
for (int i = 0; i < str.size(); i++)
{
cout << str.at(i) << " ";
}
cout << endl;
//字符修改
str[0] = 'x';
str.at(1) = 'x';
cout << str << endl;
}
int main() {
test01();
system("pause");
return 0;
}
2.1.8ストリングの挿入と削除
機能の説明:
- 文字列の文字の挿入と削除
関数プロトタイプ:
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文字を削除します
場合:
//字符串插入和删除
void test01()
{
string str = "hello";
str.insert(1, "111");
cout << str << endl;
str.erase(1, 3); //从1号位置开始3个字符
cout << str << endl;
}
int main() {
test01();
system("pause");
return 0;
}
2.1.9ストリングサブストリング
機能の説明:
- 文字列から目的の部分文字列を取得します
関数プロトタイプ:
string substr(int pos = 0, int n = npos) const;
//posで始まるn文字で構成される文字列を返します
場合:
//子串
void test01()
{
string str = "abcdefg";
string subStr = str.substr(1, 3);
cout << "subStr = " << subStr << endl;
string email = "[email protected]";
int pos = email.find("@");
string username = email.substr(0, pos);
cout << "username: " << username << endl;
}
int main() {
test01();
system("pause");
return 0;
}
この記事の内容がお役に立てば、いいね、フォロー、サポートをお願いします。
作成するのは簡単ではなく、売春も良くありません。あなたのサポートと認識が私の作成の最大の動機です。次の記事でお会いしましょう!
ドラゴンジュニア|テキスト
このブログに間違いがありましたら、批判してアドバイスしてください、大歓迎です!