MSVCRT std::vectorのソースを表示
新しいページはコチラ
移動:
案内
,
検索
[[Windows#MSVC Runtimeリファレンス|MSVC Runtimeリファレンス]]に戻る == '''概要''' == vectorは配列のようなものを扱うのに必要な機能を含んでいます。テンプレート名に指定した型を順序立てて保持し、先頭から後尾までを順番に取り出したり要素数を調べたり、途中の情報から一方向に抜きだしたりといった操作ができます。テンプレートに複数の要素を含む型を指定した場合は多次元配列のようにも振る舞い。PHPやPerlで言うハッシュ配列というモノに近い感じです。数値の型をテンプレート名に与えると、要素同士の比較もできます。 以下のように定義して使います。 <span style = "background:linear-gradient(transparent 75%, #ffbf7f 75%); font-weight:bold; "><span style="color:deeppink;">std::vector</span><<span style="color:deeppink;">クラス・構造体・型テンプレート名</span>> 変数名;</span> 例 <span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; "><span style="color:deeppink;">std::vector</span><<span style="color:deeppink;">QByteArray</span>> objVectorQByteArray_UTF8String;</span> のようにするとVectorクラスのメンバ関数とメンバ変数を含んだ状態のQByteArrayクラスのオブジェクトが作られ。例ではオブジェクトobjVectorQByteArray_UTF8Stringが作られます。 このようにして作られたオブジェクトは以下のような階層構造で、メンバ関数が呼び出せて、テンプレート名とした型のobjectを操作できます。 <span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; ">objVectorQByteArray_UTF8String.(vectorクラスのメンバ関数or変数)</span> 1番簡単な例はテンプレート名をintにすることです。最初に3つの要素があって、20,40,50となっている状態でいろいろ操作してみましょう。 <syntaxhighlight2 lang="cpp"> #include<cstdio> #include<vector> int main(int iArgc, char** cArgv){ std::vector<int> objVectorInt_data = {20, 40 ,60}; objVectorInt_data[2] = 80; //要素番号 2 の 60 が 80 に書き換えられる。 objVectorInt_data.Insert(objVectorInt_data.begin(), 10); //要素番号の一番最初objVectorInt_data.begin()に数値データ10を挿入する。 objVectorInt_data.push_back(100); //要素番号の最後に数値データ100を挿入する。 } </syntaxhighlight2> これがVectorの簡単な使い方です。ここまでは配列を使うのと同じような働きですが、メンバ関数で最初に挿入したり、最後に挿入したりすることを実現できています。自分で配列を操作して制御するよりは楽です。要素番号は0から始まります。 結果としてはobjVectorInt_dataは{10, 20, 40, 80, 100}になっています。 ==='''メンバ関数'''=== vector<TypeTmplate> obj;とした場合 *<span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; "><span style="color:deeppink;">Iterator</span> obj.<span style="color:blue;">Insert</span>(<span style="color:deeppink;">Iterator</span> position, <span style="color:deeppink;">const TypeTemplate&&</span> data);</span> //上記のサンプルプログラムで使った引数の多重定義パターン ※なんかややこしい型名になっていますが、vector型で扱う他の関数も含めて、配列の位置情報を返す型はIteratorという型名になっています。独自の型名定義にすることで、間違った引数を受け取らないようになっています。数値を受け取るはずなので、内部では単純にInt型のようなものと同じように扱われている筈です。TypeTemplateと書いた部分はよく見るリファレンスなんかでは単に T と表記されるものです。TypeTemplateは型名です。上記のサンプルプログラムではIntで定義されている部分です。const int なので、直接数字を入れれば、const intの扱いになる感じです。Tあらゆる型に対応するためのTemplateというモノです。char** でもいいし、float、longなんでも来いや!なのです。因みに&&は[[Cpp 右辺値参照]]です。右辺値参照の説明はリンク先にあります。サンプルプログラムの10は右辺値なのでね。そして、この関数自体も戻り値は Iterator になっています。 全部分からなくても良いですが、他にも同じことをするために様々なパターンで引数を設定できて、多重定義になっています。 <syntaxhighlight2 lang="cpp"> iterator obj.insert( iterator position, const TypeTemplate& data); iterator obj.insert(const_iterator position, const TypeTemplate& data); void obj.insert( iterator position, size_type size, const TypeTemplate& data); iterator obj.insert(const_iterator position, size_type n, const TypeTemplate& data); iterator obj.insert(const_iterator position, initializer_list<TypeTmplate> Initializer_listTypeTemlate_obj); template <class InputIterator>//を使う場合 void obj.insert( iterator position, InputIterator first, InputIterator last); iterator obj.insert(const_iterator position, InputIterator first, InputIterator last); </syntaxhighlight2> Iteretor を戻り値にもつ関数は挿入した後に、挿入したものが指し示された要素番号が返ってきます。難しい表記が多い世の中だけど、よくよく見るとあらゆる人間が理解できるほど単純なのだ。恐れるべからず。 === '''メンバ関数 assign''' === *<span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; "><span style="color:deeppink;">void</span> <span style="color:blue;">obj.assign</span>(<span style="color:deeppink;">size_type</span> n, <span style="color:deeppink;">const TypeTemplate&</span> u);</span> *<span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; "><span style="color:deeppink;">void</span> <span style="color:blue;">obj.assign</span>(<span style="color:deeppink;">InputIterator</span> first, <span style="color:deeppink;">InputIterator</span> last);</span> *<span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; "><span style="color:deeppink;">void</span> <span style="color:blue;">obj.assign</span>(<span style="color:deeppink;">Initializer_list<TypeTemplate></span>);</span> === '''メンバ関数 emplace_back''' === *<span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; "><span style="color:deeppink;">void</span> <span style="color:blue;">obj.emplace_back</span>(<span style="color:deeppink;">TypeTemplate(vector<TypeTemplate>&&...)</span>);</span> *<span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; "><span style="color:deeppink;">TypeTemplate&(refference_InsertValue)</span> <span style="color:blue;">obj.emplace_back</span>(<span style="color:deeppink;">TypeTemplate(vector<TypeTemplate>&&...)</span>);</span> TypeTemplate(vector<TypeTemplate>)はvectorの型テンプレートで型を生成するコンストラクタによって初期化形式である必要があります。?何を言っているの? 例えばvectorはvector<std::string> obj;のようにstd::string型を定義した場合。objはsdt::string型が順序を持って連続するような値になります。そうすると以下の例のように定義します。 sample.cpp <syntaxhighlight2 lang="cpp"> #include<cstidio> #include<vector> int main(int iArgc char** cArgv){ std::vector<std::string> objVectorStdString_data; obj.emplase_back(std::string("Hello! VectorDataString!")); //std::stringのコンストラクタでstd::string型そのものが右辺値参照として引数になる。 } </syntaxhighlight2> ※C++17以降は2つ目に書いたように TypeTemplate& のような挿入したデータへの参照を返却され、受け取ることができます。 [[[Windows#MSVC Runtimeリファレンス|MSVC Runtimeリファレンス]]に戻る
MSVCRT std::vector
に戻る。
個人用ツール
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ