私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
リストの最下層は、センチネル ビットを備えた双方向循環リンク リスト構造です。
forward_list の単一リンクリスト構造と比較して、list のイテレータは双方向イテレータです。
Vector などの順次構造のコンテナと比較して、list は任意の位置での挿入と削除の効率が高くなりますが、任意の位置でのランダム アクセスはサポートされていません。
List はテンプレート クラスです。使用する場合は、要素の型を指定する必要があります。リストクラスを使用する場合、ヘッダーファイルをインクルードする必要があります<list>
list();
例えば:
- void test()
- {
- list<int> lt;
- }
list(size_type n, const value_type& val = value_type());
例えば:
- void test()
- {
- list<int> lt(3, 1);
- for (auto i : lt)
- {
- cout << i << " ";
- }
- }
操作結果:
list(const list& x);
例えば:
- void test()
- {
- list<int> lt(3, 1);
- list<int> lt1(lt);
- for (auto i : lt1)
- {
- cout << i << " ";
- }
- }
操作結果:
- Template<class InputIterator>
-
- list(InputIterator first, InputIterator last);
例えば:
- void test()
- {
- list<int> lt(3, 1);
- list<int> lt1(lt.begin(), lt.end());
- for (auto i : lt1)
- {
- cout << i << " ";
- }
- }
操作結果:
それは今でも同じです、ここで一緒に話しましょう。
size_type size() const;
空の:戻るリストコンテナが空かどうか(つまり、サイズは0です)。
(注: この関数はコンテナを一切変更しません。クリアするにはリンクされたリストコンテナの内容については、を参照してください。リスト::クリア。)
bool empty() const;
最大サイズ(一般的には使用されません): 戻り値リンクされたリストコンテナーが保持できる要素の最大数。
(既知のシステムまたはライブラリの実装制限により、これはコンテナが達成できる最大の可能性です)サイズただし、コンテナーがそのサイズに達するという保証はありません。そのサイズに達する前には、ストレージを割り当てることができない可能性があります。 )
size_type max_size() const;
サイズ変更:コンテナに含めるサイズを変更するん要素。
もしん現在のコンテナより小さいサイズ、コンテンツは以前のものに縮小されますん要素を削除し、超過する要素を削除します (そしてそれらを破棄します)。
もしん現在のコンテナより大きいサイズ、最後に必要な数の要素を挿入することでコンテンツが展開され、目的の結果が得られます。んサイズ。指定されている場合ヴァル、その後、新しい要素は次のように初期化されます。ヴァルコピーしない場合は、値が初期化されます。
(この関数は、コンテナーに要素を挿入または削除することによって、コンテナーの実際の内容を変更することに注意してください。)
void resize (size_type n, value_type val = value_type());
例えば:
-
- void test()
- {
- list<int> lt(3, 1);
- /*list<int> lt1(lt);*/
- list<int> lt1(lt.begin(), lt.end());
- list<int> lt2;
- cout << lt1.size() <<endl;
- cout << lt1.empty() <<endl;
- cout << lt2.empty() <<endl;
- lt1.resize(10);
- cout << lt1.size() << endl;
- for (auto i : lt1)
- {
- cout << i << " ";
- }
- }
-
-
操作結果:
- iterator begin();
-
- const_iterator begin() const;
-
- iterator end();
-
- const_iterator end() const;
イテレータ: リンクされたリスト内の最初のノードと最後のノードの位置を取得するために使用されます。次のポジション (つまり、センチネルのポジション)
例えば:
- void test()
- {
- list<int> lt(5, 2);
- list<int> ::iterator it = lt.begin();
- while (it != lt.end())
- {
- cout << *it << " ";
- ++it;
- }
- }
操作結果:
逆イテレータrbegin();
const_reverse_iterator rbegin() 定数;
逆イテレータ rend();
const_reverse_iterator rend() 定数;
逆反復子。rbegin はコンテナ内の最後のノードの位置を取得し、rend はコンテナ内のセンチネル ビットの位置を取得します。
- void test()
- {
- list<int> lt = { 1,23,4,4,5,2 };
- list<int> ::reverse_iterator rit = lt.rbegin();
- while (rit != lt.rend())
- {
- cout << *rit << " ";
- ++rit;
- }
- }
操作結果:
注: 逆反復子 rit でも -- の代わりに ++ を使用する必要があります。
フロント:
front() を参照します。
const_reference front() 定数;
リンクされたリストの最初のノードに格納されているデータへの参照を返します。
戻る:
参照バック();
const_reference を戻す() const;
リンクされたリストの最後のノードに格納されているデータへの参照を返します。
例えば:
- void test()
- {
- list<int> lt = {213123,123,34524,213};
- cout << lt.front() << endl;
- cout << lt.back() << endl;
-
- }
操作結果:
Push_front は先頭挿入と呼ばれ、リンクされたリストの先頭から要素を挿入します。
void push_front(const value_type& val);
Pop_front は先頭削除と呼ばれ、リンクリストの先頭から要素を削除します。
void pop_front();
void pop_front();
例えば:
- void test()
- {
- list<int> lt = {213123,123,34524,213};
- cout << lt.front() << endl;
- lt.push_front(21345);
- cout << lt.front() << endl;
- lt.pop_front();
- cout << lt.front() << endl;
- }
操作結果:
Push_back は末尾挿入と呼ばれ、リンクされたリストの末尾から要素を挿入します。
void プッシュバック(const value_type& val);
Pop_back は末尾削除と呼ばれ、リンクされたリストの末尾から要素を削除します。
void pop_back();
例えば:
- void test()
- {
- list<int> lt = {213123,123,34524,213};
- cout << lt.back() << endl;
- lt.push_back(21345);
- cout << lt.back() << endl;
- lt.pop_back();
- cout << lt.back() << endl;
- }
操作結果:
- template <class InputIterator, class T>
-
- InputIterator find(InputIterator first, InputIterator last, const T& val);
2 つのイテレータの範囲で val を検索し、それが配置されているイテレータを返します。
例えば:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 3; i++)
- {
- lt.push_back(i);
- }
- list<int>::iterator pos = find(lt.begin(), lt.end(), 1);
- *pos = 114514;
- for (auto i : lt)
- {
- cout << i << " ";
- }
- }
操作結果:
注: この関数は list のメンバー関数ではなく、標準ライブラリ内の関数です。複数のコンテナーが find 関数を共有します。
ご覧のとおり、リストのイテレータを直接逆参照してその内容を変更できますが、イテレータはノードを指すべきではないでしょうか?逆参照するとデータが変更されるのはなぜですか?
実際、リストのイテレータは、元のエコロジー ポインタを使用してシミュレートおよび実装されず、最後にカプセル化する必要があります。これは、リストのシミュレートされた実装のソース コードに反映されます。
イテレータ挿入(イテレータ位置、const value_type& val);
void insert(イテレータの位置、size_type n、const value_type& val);
————————————————————————————————————————
テンプレート<class InputIterator>
void insert(イテレータの位置、InputIterator の最初、InputIterator の最後);
位置の前に 1 つ以上の要素を挿入します
例えば:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 3; i++)
- {
- lt.push_back(i);
- }
- list<int>::iterator pos = find(lt.begin(), lt.end(), 1);
- lt.insert(pos, 8848);
- for (auto i : lt)
- {
- cout << i << " ";
- }
- }
操作結果:
注意深い学生は、リストの挿入操作がイテレータが無効になることはありませんpos が指すノードは変更されず、相対位置も変わらないためです。
ただし、リストの削除操作により反復子は確実に無効になり、削除されたノードを指す反復子のみが無効になり、他の反復子には影響しません。
- iterator erase(iterator position);
-
- iterator erase(iterator first, iterator last);
位置の要素、または範囲 [first, last) 内のすべての要素を削除します。
例えば:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 3; i++)
- {
- lt.push_back(i);
- }
- list<int>::iterator pos = find(lt.begin(), lt.end(), 1);
- lt.erase(lt.begin());
- for (auto i : lt)
- {
- cout << i << " ";
- }
- }
操作結果:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 3; i++)
- {
- lt.push_back(i);
- }
- list<int>::iterator pos = find(lt.begin(), lt.end(), 2);
- lt.erase(lt.begin(),pos);
- for (auto i : lt)
- {
- cout << i << " ";
- }
- }
操作結果:
void swap(ベクトル& x);
2 つのリスト オブジェクトを交換する
例えば:
- void test()
- {
- list<int> lt;
- list<int> lt2(6, 12);
- for (int i = 0; i < 10; i++)
- {
- lt.push_back(i);
- }
- lt.swap(lt2);
- for (auto i : lt2)
- {
- cout << i << " ";
- }
- cout << endl;
- }
操作結果:
テンプレート<class InputIterator>
void 割り当て(InputIterator 最初、InputIterator 最後);
void を割り当てます(size_type n、const value_type& val);
リストの新しいコンテンツを指定し、現在のコンテンツを置き換えて、ノードの数を変更します。
例えば:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 10; i++)
- {
- lt.push_back(i);
- }
- lt.assign(4, 0);
- for (auto i : lt)
- {
- cout << i << " ";
- }
- }
操作結果:
void をクリアします。
リンクされたリスト内のすべてのノードを削除します
例えば:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 10; i++)
- {
- lt.push_back(i);
- }
- lt.clear();
- cout << lt.size() << endl;
- }
操作結果:
void ソート();
テンプレート<class Compare>
void sort(compを比較します);
リスト構造の特殊性により、反復子は減算演算を実行できないため、標準ライブラリのsort関数は使用できません。
また、C++ ドキュメントでは、標準ライブラリのソートも反復子の種類をランダム アクセス (RandomAccess) に制限していることがわかります。
- default (1)
- template <class RandomAccessIterator>
- void sort (RandomAccessIterator first, RandomAccessIterator last);
- custom (2)
- template <class RandomAccessIterator, class Compare>
- void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
イテレータにはいくつかの機能カテゴリがあります。
- 一方向反復子、++ のみ実行可能
- 双方向反復子。++ および -- を指定できます。
- ランダムな反復子。++、--、+、- を指定できます。
ただし、リストのソート関数は必要ありません。リンクされたリストを直接ソートする効率は、ベクトルにコピーしてソートしてからリンク リストにコピーし戻すよりもはるかに遅いためです。
template <class BidirectionalIterator> void reverse (BidirectionalIterator first, BidirectionalIterator last);
リンクされたリストを逆にします
例えば:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 10; i++)
- {
- lt.push_back(i);
- }
- for (auto i : lt)
- {
- cout << i << " ";
- }
- cout << endl;
- lt.reverse();
- for (auto i : lt)
- {
- cout << i << " ";
- }
- cout << endl;
-
- }
操作結果:
間違いがある場合は修正してください。