📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

編集の要約なし
 
(同じ利用者による、間の12版が非表示)
18行目: 18行目:
== vectorを使用する前に ==
== vectorを使用する前に ==
vectorを使用するためには、以下ののヘッダファイルをインクルードする必要がある。<br>
vectorを使用するためには、以下ののヘッダファイルをインクルードする必要がある。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <vector>
  #include <vector>
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


28行目: 28行目:
intやdouble等の基本的な型のみならず、任意で作成したクラスも使用できる。<br>
intやdouble等の基本的な型のみならず、任意で作成したクラスも使用できる。<br>
ここで、Tはデータ型、Nは要素数、dは初期化する値を表すものとする。<br>
ここで、Tはデータ型、Nは要素数、dは初期化する値を表すものとする。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  vector<T> v;
  vector<T> v;
  vector<T> v();
  vector<T> v();
  vector<T> v(N);
  vector<T> v(N);
  vector<T> v(N, d);
  vector<T> v(N, d);
  </source>
  </syntaxhighlight>
<br>
<br>
===== 2次元配列 =====
===== 2次元配列 =====
2次元配列のvectorの宣言は以下の通りである。<br>
2次元配列のvectorの宣言は以下の通りである。<br>
ここで、Mは要素数を表すものとする。<br>
ここで、Mは要素数を表すものとする。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  vector<vector<T>> vv;
  vector<vector<T>> vv;
  vector<vector<T>> vv();
  vector<vector<T>> vv();
44行目: 44行目:
  vector<vector<T>> vv(N, vector<T>(M));
  vector<vector<T>> vv(N, vector<T>(M));
  vector<vector<T>> vv(N, vector<T>(M, d));
  vector<vector<T>> vv(N, vector<T>(M, d));
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


52行目: 52行目:
===== 1次元配列 =====
===== 1次元配列 =====
v[]のi番目にdを代入して、それを出力する場合は以下となる。<br>
v[]のi番目にdを代入して、それを出力する場合は以下となる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  v[i] = d;
  v[i] = d;
  cout << v[i] << endl;
  cout << v[i] << endl;
  </source>
  </syntaxhighlight>
<br>
<br>
===== 2次元配列 =====
===== 2次元配列 =====
v[][]のi番目およびj番目にdを代入して、それを出力する場合は以下となる。<br>
v[][]のi番目およびj番目にdを代入して、それを出力する場合は以下となる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  v[i][j] = d;
  v[i][j] = d;
  cout << v[i][j] << endl;
  cout << v[i][j] << endl;
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


70行目: 70行目:
===== 1次元配列 =====
===== 1次元配列 =====
v[]の要素数をN個に変更する場合は以下の通りである。<br>
v[]の要素数をN個に変更する場合は以下の通りである。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  v.resize(N);
  v.resize(N);
  </source>
  </syntaxhighlight>
<br>
<br>
===== 2次元配列 =====
===== 2次元配列 =====
vv[][]の要素数をN * Nに変更する場合は以下の通りである。<br>
vv[][]の要素数をN * Nに変更する場合は以下の通りである。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // 方法 1
  // 方法 1
  vv.resize(N);
  vv.resize(N);
86行目: 86行目:
  // 方法 2
  // 方法 2
  vv.resize(N, vector<T>(N));
  vv.resize(N, vector<T>(N));
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


92行目: 92行目:
===== 1次元配列 =====
===== 1次元配列 =====
v[]の末尾にデータを追加する場合は以下の通りである。<br>
v[]の末尾にデータを追加する場合は以下の通りである。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  v.push_back(d);
  v.push_back(d);
  </source>
  </syntaxhighlight>
<br>
<br>
===== 2次元配列 =====
===== 2次元配列 =====
vv[][]のi番目の末尾にデータを追加する場合は以下の通りである。<br>
vv[][]のi番目の末尾にデータを追加する場合は以下の通りである。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  vv[i].push_back(d);
  vv[i].push_back(d);
  </source>
  </syntaxhighlight>
<br><br>
 
== サイズの確認 ==
==== 空かどうかを確認 ====
std::vectorクラスが空かどうかを確認する場合、いくつかの方法が存在する。<br>
<br>
* <code>empty</code>メソッドを使用する。(推奨)
*: コードの意図が明確である。
*: 多くの実装では、<u>O(1)</u>の時間複雑度で動作する。
*: 他のSTLコンテナでも同様に使用できる。
<syntaxhighlight lang="c++">
std::vector<int> vec;
if (vec.empty()) {
    std::cout << "Vector is empty" << std::endl;
}
else {
    std::cout << "Vector is not empty" << std::endl;
}
</syntaxhighlight>
<br>
* <code>size</code>メソッドを使用する。
*: ただし、emptyメソッドの方がベクトルが空かどうかを確認する意図をより明確に表現することができる。
<syntaxhighlight lang="c++">
std::vector<int> vec;
if (vec.size() == 0) {
    std::cout << "Vector is empty" << std::endl;
}
else {
    std::cout << "Vector is not empty" << std::endl;
}
</syntaxhighlight>
<br>
* ベクトルの開始と終了イテレータを比較する。
<syntaxhighlight lang="c++">
std::vector<int> vec;
if (vec.begin() == vec.end()) {
    std::cout << "Vector is empty" << std::endl;
}
else {
    std::cout << "Vector is not empty" << std::endl;
}
</syntaxhighlight>
<br>
* <code>std::ranges::empty</code>メソッドを使用する。(C++20以降)
*: この方法は、std::vectorクラスだけでなく、他の範囲 (range) に対しても同様に使用できるため、より汎用的である。
<syntaxhighlight lang="c++">
#include <ranges>
std::vector<int> vec;
if (std::ranges::empty(vec)) {
    std::cout << "Vector is empty" << std::endl;
}
else {
    std::cout << "Vector is not empty" << std::endl;
}
</syntaxhighlight>
<br><br>
<br><br>


106行目: 166行目:
vectorをコピーする方法は複数存在する。<br>
vectorをコピーする方法は複数存在する。<br>
ここでは、v1[]をv2[]にコピーする方法を記述する。<br>
ここでは、v1[]をv2[]にコピーする方法を記述する。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // 方法 1
  // 方法 1
  v2 = v1
  v2 = v1
119行目: 179行目:
  // 方法 3
  // 方法 3
  copy(v1.begin(), v1.end(), v2.begin());
  copy(v1.begin(), v1.end(), v2.begin());
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== vectorの全要素を末尾に追加 ==
== vectorの全要素を末尾に追加 ==
v1[]をv2[]の末尾に追加する方法は以下の通りである。(方法3が最も簡潔)<br>
v1[]をv2[]の末尾に追加する方法は以下の通りである。(方法3が最も簡潔)<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // 方法 1
  // 方法 1
  int size = v2.size();
  int size = v2.size();
141行目: 201行目:
  // 方法 3
  // 方法 3
  copy(v1.begin(), v1.end(), back_inserter(v2));
  copy(v1.begin(), v1.end(), back_inserter(v2));
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== 指定範囲をコピー ==
== 指定範囲をコピー ==
v1[]のa番目からb番目をv2[]にコピーする方法は以下の通りである。(方法2が簡潔)<br>
v1[]のa番目からb番目をv2[]にコピーする方法は以下の通りである。(方法2が簡潔)<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // 方法 1
  // 方法 1
  v2.resize(b - a);
  v2.resize(b - a);
156行目: 216行目:
  // 方法 2
  // 方法 2
  copy(v1.begin() + a, v1.begin() + b, v2.begin());
  copy(v1.begin() + a, v1.begin() + b, v2.begin());
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


164行目: 224行目:
ここでは、総和を求めるプログラムとvectorの全要素を表示するプログラムを例として挙げる。<br>
ここでは、総和を求めるプログラムとvectorの全要素を表示するプログラムを例として挙げる。<br>
ただし、処理時間などの理由から参照渡しを使用して、vectorの内容を変更しない場合はconstを付加する。<br>
ただし、処理時間などの理由から参照渡しを使用して、vectorの内容を変更しない場合はconstを付加する。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // 配列の総和を求めるプログラム
  // 配列の総和を求めるプログラム
  T SumVector(const vector<T> &v)
  T SumVector(const vector<T> &v)
201行目: 261行目:
     }
     }
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


208行目: 268行目:
しかし、戻り値にするとvectorをコピーするために時間が掛かるので、引数として参照渡しする方がよい<br>
しかし、戻り値にするとvectorをコピーするために時間が掛かるので、引数として参照渡しする方がよい<br>
以下のサンプルコードでは、ventorの全要素をscale倍している。<br>
以下のサンプルコードでは、ventorの全要素をscale倍している。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  vector<int> ScalarVen(const vector<int> &v, int scale)
  vector<int> ScalarVen(const vector<int> &v, int scale)
  {
  {
219行目: 279行目:
     return mul;
     return mul;
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== ソート ==
== ソート ==
vectorでは、sort関数を使用することで昇順ソートおよび降順ソートを行うことができる。<br>
vectorでは、sort関数を使用することで昇順ソートおよび降順ソートを行うことができる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // 昇順ソート
  // 昇順ソート
  sort(v.begin(), v.end());
  sort(v.begin(), v.end());
230行目: 290行目:
  // 降順ソート
  // 降順ソート
  sort(v.begin(), v.end(), greater<int>());
  sort(v.begin(), v.end(), greater<int>());
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== 指定要素の削除 ==
== 指定要素の削除 ==
vectorでは、erase関数を使用することで任意の要素を削除することができる。<br>
vectorでは、erase関数を使用することで任意の要素を削除することができる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // 先頭の要素を削除する
  // 先頭の要素を削除する
  v.erase(v.begin());
  v.erase(v.begin());
244行目: 304行目:
  // 先頭からi番目の要素を削除する
  // 先頭からi番目の要素を削除する
  v.erase(v.begin() + i);
  v.erase(v.begin() + i);
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


250行目: 310行目:
コマンドライン引数(int argcとchar *argv[])を取得する。<br>
コマンドライン引数(int argcとchar *argv[])を取得する。<br>
vector<string>を使用すると良い。<br>
vector<string>を使用すると良い。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <vector>
  #include <vector>
  #include <string>
  #include <string>
260行目: 320行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
 
== 要素の反転 ==
<code>std::reverse</code>アルゴリズムは、STLアルゴリズムの一部であり、任意の範囲の要素の順序を逆にすることができる。<br>
最初と最後のペアから始まる2つの要素を内部的に交換する。また、指定された範囲のイテレータを表す2つの引数を取る。<br>
<br>
以下の例では、文字をvectorとして生成して、<code>std::reverse</code>アルゴリズムを使用して反転している。<br>
<syntaxhighlight lang="c++">
#include <iostream>
#include <iterator>
#include <iomanip>
#include <vector>
int main()
{
    std::vector<char> arr = {'h', 'o', 'g', 'e'};
    //size_t width = 4;
    //arr.reserve(width);
    std::cout << std::left << std::setw(10) << "arr: ";
    copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout,"; "));
    std::cout << std::endl;
    std::reverse(arr.begin(), arr.end());
    std::cout << std::left << std::setw(10) << "arr: ";
    copy(arr.begin(), arr.end(), std::ostream_iterator<int>(cout,"; "));
    std::cout << std::endl;
    return EXIT_SUCCESS;
}
</syntaxhighlight>
<br>
// 出力例
arr:      h; o; g; e;
arr:      e; g; o; h;
<br><br>
 
== 要素の回転 ==
<code>std::rotate</code>は、要素を左にシフトして、ベクトル境界の外側に移動された要素をラップする。<br>
<code>std::rotate</code>は<code>ForwardIt</code>イテレータの3つの引数を取り、第2引数が指す要素が、新しく生成されたリストの最初の位置に移動するように回転する。<br>
<syntaxhighlight lang="c++">
#include <iostream>
#include <iterator>
#include <iomanip>
#include <vector>
int main()
{
    std::vector<int> arr = {1, 2, 3, 4, 5, 6};
    std::cout << std::left << std::setw(10) << "arr: ";
    copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, "; "));
    std::cout << std::endl;
    std::rotate(arr.begin(), arr.begin() + (arr.size() / 2), arr.begin() + arr.size());
    std::cout << std::left << std::setw(10) << "arr: ";
    copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, "; "));
    std::cout << std::endl;
    return EXIT_SUCCESS;
}
</syntaxhighlight>
<br>
// 出力例
arr:      1; 2; 3; 4; 5; 6;
arr:      4; 5; 6; 1; 2; 3;
<br><br>
 
== 要素の並べ替え(ランダム) ==
<code>std::shuffle</code>を使用して、要素の各順列が等しい確率を持つように、範囲内の要素をランダムに並べ替えることができる。<br>
<br>
この関数は、範囲の開始イテレータと終了イテレータの少なくとも2つの引数が必要である。<br>
また、乱数ジェネレータ関数を表す第3引数を指定することもできる。<br>
<br>
以下の例では、第3引数において、<code>random</code>ヘッダファイルにある<code>mersenne_twister_engine</code>を使用している。<br>
<syntaxhighlight lang="c++">
#include <iostream>
#include <iterator>
#include <iomanip>
#include <random>
#include <vector>
int main()
{
    std::vector<int> arr = {1, 2, 3, 4, 5, 6};
    std::cout << std::left << std::setw(10) << "arr: ";
    copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout,"; "));
    std::cout << std::endl;
    // vecotorの要素をランダムに並べ替える
    std::shuffle(arr.begin(), arr.end(), std::mt19937(std::random_device()()));
 
    std::cout << std::left << std::setw(10) << "arr: ";
    copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout,"; "));
    std::cout << std::endl;
    return EXIT_SUCCESS;
}
</syntaxhighlight>
<br>
// 出力例
arr:      1; 2; 3; 4; 5; 6;
arr:      5; 1; 4; 6; 2; 3;
<br><br>
<br><br>


266行目: 433行目:
vectorに対するループ文は、インデックスを使用するよりもRange Based Loopを使用した方が良い。<br>
vectorに対するループ文は、インデックスを使用するよりもRange Based Loopを使用した方が良い。<br>
以下のサンプルコードに、Range Based Loopを使用したループ文を記述する。<br>
以下のサンプルコードに、Range Based Loopを使用したループ文を記述する。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // 1次元vectorの場合
  // 1次元vectorの場合
  void view(const vector<T> &v)
  void view(const vector<T> &v)
291行目: 458行目:
     }
     }
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
 
== 要素の検索 ==
algorithmのfindメソッドを使用して、要素を検索をすることができる。<br>
<syntaxhighlight lang="c++">
#include <algorithm>
vector<string> vec = {"hoge", "piyo", "fuga", "foo", "bar"};
if (find(vec.begin(), vec.end(), "fuga") != vec.end()) std::cout << "検索成功" << std::endl;
else                                                  std::cout << "検索失敗" << std::endl;
</syntaxhighlight>
<br><br>
 
== 全要素の入れ替え ==
swapメソッドを使用して、2つのvecorクラスの全要素を入れ替えることができる。<br>
<syntaxhighlight lang="c++">
vector<int> vec1 = {10, 20, 30, 40, 50};
vector<int> vec2 = {100, 200, 300};
// 全要素の入れ替え
vec1.swap(vec2);  // または、vec1.swap(vec1, vec2);
</syntaxhighlight>
<br><br>
<br><br>


== vectorの解放(Swap技法) ==
== vectorの解放 (Swap技法) ==
関数内にて宣言して使用するvectorは、その関数を抜ければ自動でメモリの解放を行うが、<br>
関数内にて宣言して使用するvectorは、その関数を抜ければ自動でメモリの解放を行うが、<br>
クラスのメンバ変数としてvectorを使用する場合は、クラスのデストラクタが実行されるまでメモリの解放を行わない。<br>
クラスのメンバ変数としてvectorを使用する場合は、クラスのデストラクタが実行されるまでメモリの解放を行わない。<br>
303行目: 493行目:
そこで使用されるのがSwap技法と呼ばれる手法である。<br>
そこで使用されるのがSwap技法と呼ばれる手法である。<br>
これは、vectorのswap()関数を使用して一時オブジェクトと交換することで、vectorのデストラクタを強制的に実行させる。<br>
これは、vectorのswap()関数を使用して一時オブジェクトと交換することで、vectorのデストラクタを強制的に実行させる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // クラス内に要素数100のvectorを宣言
  // クラス内に要素数100のvectorを宣言
  std::vector<int> m_vec(100);
  std::vector<int> m_vec(100);
309行目: 499行目:
  // Swap技法によるメモリの解放
  // Swap技法によるメモリの解放
  std::vector<int>().swap(m_vec);
  std::vector<int>().swap(m_vec);
  </source>
  </syntaxhighlight>
<br><br>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:C++]]
[[カテゴリ:C++]]