ベクターの使い方を学ぶ

Vector はクラス テンプレートを使用するため、明示的にインスタンス化する必要があります。

 

単一パラメーターのコンストラクターは暗黙的な型変換をサポートします

 

Vector<char> は文字列を置き換えることができますか?

答えはもちろんノーです

1. 文字列の最後には '\0' が必要ですが、これは C 言語と非常に互換性があります。

Vector には要件がなく、C 言語との互換性があまりありません。

2. 文字列のインターフェイスはベクトルのインターフェイスよりも豊富です。文字列には、サイズを比較する += などの特別なインターフェイスが多数あります (ベクトル間のサイズの比較はあまり重要ではありません)。

 

単一パラメーターのコンストラクターは暗黙的な型変換をサポートします

 

ベクター

d4a175411dff4e7aafea1b01ba91b420.png

Alloc: スペース アロケータ、メモリ プール (T はメモリ アプリケーションの効率を向上させます)

以下はテンプレートパラメータです

 

4dadad9c104a4423a22fd396fae83f1d.png

 

構造

c074e794beae4159aea7e070df7d7b64.png

 パラメータ構築なし

n T(テンプレート)構築vector

ここではイテレータの構築をテンプレートとして記述しているため、ベクトルイテレータの初期化に限定されず、他のコンテナのイテレータも使用できます。

コピー構築

void test_vector3()
{
    //n个T初始化
	vector<int> v1(10, 1);
	vector<string> v2(10, "***");

	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	for (auto e : v2)
	{
		cout << e << " ";
	}
	cout << endl;

	// 自己类型的迭代器
	vector<int> v3(v1.begin(), v1.end());
	for (auto e : v3)
	{
		cout << e << " ";
	}
	cout << endl;

    //其它类型的迭代器
	string str("hello world");
	vector<char> v4(str.begin(), str.end());
	for (auto e : v4)
	{
		cout << e << " ";
	}
	cout << endl;
    
    //指针
	int a[] = { 16,2,77,29 };
	vector<int> v5(a, a+4);
	for (auto e : v5)
	{
		cout << e << " ";
	}
	cout << endl;
}

b876d0dea10a4de98560725d1bc12873.png

 

コンテナとアルゴリズム

アルゴリズムヘッダファイル

#include<アルゴリズム>

これらの間隔は通常、左側が閉じ、右側が開きます。

イテレータを介してコンテナ内のデータにアクセスする

#include<algorithm>

int a[]={16,2,77,29};
vector<int>vint(a,a+4);

//升序
//默认less
sort(vint.begin(),vint.end());

for(auto e:vint)
cout<<e<<" ";
cout<<endl;

//降序
//greater
//greater<int>gt;
//sort(vint.begin(),vint.end(),gt);
//匿名对象
sort(vint.begin(),vint.end(),greater<int>());

for(auto e:vint)
cout<<e<<" ";
cout<<endl;

d7d18a5f42a14145932d89406268d8d3.png

 逆反復子は降順にソートすることもできます。逆に配置して逆方向にトラバースすることに相当します。

 

予約(スペースを空け、サイズを変更しない)とサイズ変更(スペースを空けて初期化、サイズを変更)

リザーブでよくある間違い

6dad73c04718487eaef6680533ddcf67.png

 予約ではサイズが変更されないため、このコードはエラーを報告し、範囲外にアクセスします。

99bfbf65cda3480587c9ae05b962067d.png

 

データを挿入するには、reserve を Push_back と組み合わせて使用​​する必要があります

 

解決策は、サイズ変更を使用して開くことです

サイズ変更は初期化され、サイズも大きくなります。

void test_vector4()
{
//resize单独使用
	vector<int> v1;
	//cout << v1.max_size() << endl;
	//v1.reserve(10);
	v1.resize(10);
	for (size_t i = 0; i < 10; i++)
	{
		v1[i] = i;
	}

	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

//reserve配合push_back使用
	vector<int> v2;
	v2.reserve(10);
	for (size_t i = 0; i < 10; i++)
	{
		v2.push_back(i);
	}
	for (auto e : v2)
	{
		cout << e << " ";
	}
	cout << endl;
}

 

と []

境界を越えると例外がスローされ、例外のスローはログを記録するために使用されます。

[] 範囲外はアサーションです。アサーションはデバッグ時にのみ有効であり、リリースでは機能しません。
 

データは文字列の c_str と同等です

 

プッシュバックとポップバック

尾部の挿入、尾部の削除

ヘッドプラグとヘッド削除は非効率的であり、対応するインターフェイスを提供しません。

 

消して挿入する

任意の位置に削除または挿入(頭の挿入、頭の削除に使用可能)

 

特定のデータを削除する必要がある場合、その場所はどうやって見つければよいでしょうか?

Vector は検索インターフェイスを提供しません

ただし、アルゴリズムには検索インターフェイスが提供されています

対応する位置を返すイテレータは見つかったが、最後のデータを返す次の位置が見つからない

a4c189d687104cbc897d295154c1efae.png

 

void test_vector5()
{
	int a[] = { 16,2,77,29,3,33,43,3,2,3,3,2 };
	vector<int> v1(a, a + sizeof(a)/sizeof(int));
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	// 头删
	v1.erase(v1.begin());
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	// 头插 
	v1.insert(v1.begin(), 100);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	// 删除第3个数据
	v1.erase(v1.begin()+2);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	// 删除3,但是不知道3在哪个位置,怎么办?
	//vector<int>::iterator pos = find(v1.begin(), v1.end(), 3);
	auto pos = find(v1.begin(), v1.end(), 3);
	if (pos != v1.end())
	{
		v1.erase(pos);
	}
}

 

では、配列内のすべての値を削除するには何が必要でしょうか?

削除して別の検索を行うことはできますが、次に削除した位置から検索を開始すると、イテレータの失敗の問題が発生し、プログラムが直接クラッシュします。効率が低すぎます。

void test_vector6()
{
	// 删除所有的3 -- 涉及迭代器失效!
	while(pos != v1.end())
	{
		v1.erase(pos);
		//pos = find(pos+1, v1.end(), 3);
		pos = find(v1.begin(), v1.end(), 3);
	}

	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	v1.assign(10, 1);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
}

 

割当

元のデータをクリアして再割り当てする

3f7ff48ed62749728d47d82cbc854d1e.png

 ベクトル展開ロジック

g++ は STL の sgi バージョンを使用します

vsはpjバージョンを採用

81b9ecc06aa0449fb77d1fec62cfdc8c.png

 

フルソート

ベクトル OJ 質問

電話番号のモノグラム

a18e2ea096ac4a089ea86c8c241c9e2e.png

 

 

おすすめ

転載: blog.csdn.net/2202_75625589/article/details/131609722