Vector はクラス テンプレートを使用するため、明示的にインスタンス化する必要があります。
単一パラメーターのコンストラクターは暗黙的な型変換をサポートします
Vector<char> は文字列を置き換えることができますか?
答えはもちろんノーです
1. 文字列の最後には '\0' が必要ですが、これは C 言語と非常に互換性があります。
Vector には要件がなく、C 言語との互換性があまりありません。
2. 文字列のインターフェイスはベクトルのインターフェイスよりも豊富です。文字列には、サイズを比較する += などの特別なインターフェイスが多数あります (ベクトル間のサイズの比較はあまり重要ではありません)。
単一パラメーターのコンストラクターは暗黙的な型変換をサポートします
ベクター
Alloc: スペース アロケータ、メモリ プール (T はメモリ アプリケーションの効率を向上させます)
以下はテンプレートパラメータです
構造
パラメータ構築なし
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;
}
コンテナとアルゴリズム
アルゴリズムヘッダファイル
#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;
逆反復子は降順にソートすることもできます。逆に配置して逆方向にトラバースすることに相当します。
予約(スペースを空け、サイズを変更しない)とサイズ変更(スペースを空けて初期化、サイズを変更)
リザーブでよくある間違い
予約ではサイズが変更されないため、このコードはエラーを報告し、範囲外にアクセスします。
データを挿入するには、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 は検索インターフェイスを提供しません
ただし、アルゴリズムには検索インターフェイスが提供されています
対応する位置を返すイテレータは見つかったが、最後のデータを返す次の位置が見つからない
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;
}
割当
元のデータをクリアして再割り当てする
ベクトル展開ロジック
g++ は STL の sgi バージョンを使用します
vsはpjバージョンを採用
フルソート
ベクトル OJ 質問
電話番号のモノグラム