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

ページの作成:「== 概要 == <code>std::array</code>は、C++11で追加された固定長配列のコンテナクラスである。<br> <code>std::vector</code>に存在する<code>size…」
 
文字列「__FORCETOC__」を「{{#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 pag…
 
(同じ利用者による、間の1版が非表示)
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>
  </syntaxhighlight>
<br><br>
<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>
<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++]]