📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
ページの作成:「== 概要 == <code>std::array</code>は、C++11で追加された固定長配列のコンテナクラスである。<br> <code>std::vector</code>に存在する<code>size…」 |
|||
| 143行目: | 143行目: | ||
int *ptr = ar.data(); // ptrはarの先頭要素へのポインタ | int *ptr = ar.data(); // ptrはarの先頭要素へのポインタ | ||
cout << *ptr << "\n"; // ptrが指す値(1)が表示される | cout << *ptr << "\n"; // ptrが指す値(1)が表示される | ||
</syntaxhighlight> | |||
<br> | |||
==== std::arrayの状態を変更 ==== | |||
* void fill(値) | |||
* void swap() | |||
* void fill(値) | |||
<br> | |||
fillメソッドは、std::arrayの全ての要素を指定した値にする。 | |||
<syntaxhighlight lang="c++"> | |||
std::array<int, 10> ar; | |||
ar.fill(123); // 全要素を123に変更する | |||
</syntaxhighlight> | |||
<br> | |||
swapメソッドは、引数で指定されたオブジェクトと内容を入れ替える。 | |||
入れ替えるstd::arrayオブジェクトは、型および要素数ともに同一であることに注意する。 | |||
<syntaxhighlight lang="c++"> | |||
std::array<int, 5> x{1, 2, 3, 4, 5}, | |||
y{6, 7, 8, 9, 10}; | |||
x.swap(y); // xとyの内容を入れ替える | |||
</syntaxhighlight> | |||
<br> | |||
<u>※注意</u><br> | |||
<u><code>std::vector</code>の場合、オブジェクトが持つデータ領域へのポインタ等を交換するだけであるため、処理時間はO(1)であるが、</u><br> | |||
<u><code>std::array</code>の場合、要素の全てを交換するため、処理時間はO(N)となる。</u><br> | |||
<br> | |||
==== イテレータ ==== | |||
* begin() : iterator | |||
* end() : iterator | |||
* cbegin() : const_iterator | |||
* cend() : const_iterator | |||
<br> | |||
beginメソッドとendメソッド<br> | |||
beginメソッドは、最初の要素へのイテレータ、endメソッドは最後の要素の次へのイテレータを返す。<br> | |||
<syntaxhighlight lang="c++"> | |||
int i = 0; | |||
for(auto itr = ar.begin(); itr != ar.end(); itr++, i++) | |||
{ | |||
*itr = i; | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
cbeginメソッドとcendメソッド<br> | |||
cbeginメソッドは最初の要素へのconstイテレータ、cendメソッドは最後の要素の次のconstイテレータを返す。<br> | |||
通常のイテレータの場合、*itr = 123;のように指している先の値を変更できるが、constイテレータの場合、*itr = 123;のように記述するとコンパイルエラーとなる。<br> | |||
<syntaxhighlight lang="c++"> | |||
for(auto itr = ar.cbegin(); itr != ar.cend(); ++itr) | |||
{ | |||
// *itr = 123; // const イテレータの指す先への代入はコンパイルエラーとなる | |||
std::cout << *itr << "\n"; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== アルゴリズム == | |||
C++には便利なアルゴリズムがいくつも用意されている。<br> | |||
http://www.cplusplus.com/reference/algorithm/<br> | |||
<br> | |||
<code>std::array</code>に対してよく使用されるアルゴリズムを、以下に記載する。<br> | |||
* accumulate(first, last, 初期値) : 要素型 | |||
* void sort(first, last) | |||
* void reverse(first, last) | |||
<br> | |||
==== accumulate(first, last, 初期値) ==== | |||
<code>accumulate(<オブジェクト名>.begin(), <オブジェクト名>.end(), init)</code>メソッドは、コンテナの最初から最後までを要素を積算(全加算)する。<br> | |||
第3引数は、初期値(通常は0)を指定する。<br> | |||
<br> | |||
なお、<code>accumulate</code>メソッドを使用するには、<code>#include <numeric></code>が必要である。<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <numeric> | |||
int main() | |||
{ | |||
std::array<int, 10> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; | |||
std::cout << std::accumulate(v.begin(), v.end(), 0) << "\n"; | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
一部だけを積算する場合、<code>accumulate(v.begin() + i, v.begin() + k, 0)</code>のように、イテレータで範囲を指定する。<br> | |||
また、<code>accumulate(&v[i], &v[k], 0)</code>のように、要素へのポインタで指定することも可能である。<br> | |||
<br> | |||
==== sort(first, last) ==== | |||
<code>sort(<オブジェクト名>.begin(), <オブジェクト名>.end())</code>メソッドは、コンテナの要素を昇順にソートする。<br> | |||
なお、<code>sort</code>メソッドを使用するには、<code>#include <algorithm></code>が必要である。<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <algorithm> | |||
int main() | |||
{ | |||
std::array<int, 11> v{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}; | |||
std::sort(v.begin(), v.end()); | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
一部をソートする場合、<code>sort(v.begin() + i, v.begin() + k)</code>のように、イテレータで範囲を指定する。<br> | |||
また、<code>sort(&v[i], &v[k])</code>のように、要素へのポインタで指定することも可能である。<br> | |||
<br> | |||
==== reverse(first, last) ==== | |||
<code>reverse(<オブジェクト名>.begin(), <オブジェクト名>.end())</code>メソッドは、コンテナの要素を逆順にする。<br> | |||
<syntaxhighlight lang="c++"> | |||
std::array<int, 11> v{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}; | |||
std::reverse(v.begin(), v.end()); // 順序反転 | |||
for(auto x : v) | |||
{ | |||
std::cout << x << " "; | |||
} | |||
std::cout << "\n"; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> | ||