<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>アルゴリズム – AichiLog</title>
	<atom:link href="https://aichi.blog/tag/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0/feed/" rel="self" type="application/rss+xml" />
	<link>https://aichi.blog</link>
	<description>学びて富み　富みて学ぶ</description>
	<lastBuildDate>Mon, 24 Feb 2025 14:29:09 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://aichi.blog/wp-content/uploads/2021/12/cropped-915AB649-D1E9-4810-9658-CB8CE1B605FD.JPEG-2-32x32.jpeg</url>
	<title>アルゴリズム – AichiLog</title>
	<link>https://aichi.blog</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://aichi.blog/tag/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0/feed/"/>
	<item>
		<title>イテレータの基本と活用方法を徹底解説！</title>
		<link>https://aichi.blog/iterator-and-usage/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=iterator-and-usage</link>
		
		<dc:creator><![CDATA[愛知郎]]></dc:creator>
		<pubDate>Mon, 24 Feb 2025 14:21:56 +0000</pubDate>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[競技プログラミング]]></category>
		<guid isPermaLink="false">https://aichi.blog/iterator-and-usage/</guid>

					<description><![CDATA[<p>目次 はじめにイテレータとは？イテレータの基本基本的なイテレータの使い方イテレータを使ったループ処理イテレータの各種操作イテレータの移動イテレータの指す要素のメンバにアクセスイテレータの指す要素の削除注意点まとめ はじめ [&#8230;]</p>
<p>The post <a href="https://aichi.blog/iterator-and-usage/">イテレータの基本と活用方法を徹底解説！</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">イテレータとは？</a><ol><li><a href="#toc3" tabindex="0">イテレータの基本</a></li><li><a href="#toc4" tabindex="0">基本的なイテレータの使い方</a></li></ol></li><li><a href="#toc5" tabindex="0">イテレータを使ったループ処理</a></li><li><a href="#toc6" tabindex="0">イテレータの各種操作</a><ol><li><a href="#toc7" tabindex="0">イテレータの移動</a></li><li><a href="#toc8" tabindex="0">イテレータの指す要素のメンバにアクセス</a></li></ol></li><li><a href="#toc9" tabindex="0">イテレータの指す要素の削除</a><ol><li><a href="#toc10" tabindex="0">注意点</a></li></ol></li><li><a href="#toc11" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>C++のイテレータは、配列や <code>vector</code>、<code>map</code> などのコンテナの要素を順番に処理するために使用されます。本記事では、イテレータの基本的な操作方法や応用的な使い方を詳しく解説していきます。</p>
<p><h2><span id="toc2">イテレータとは？</span></h2>
<p>イテレータは、C++のコンテナ（<code>vector</code>, <code>map</code>, <code>set</code> など）内の要素にアクセスするためのポインタのようなオブジェクトです。</p>
<p><h3><span id="toc3">イテレータの基本</span></h3>
<li><strong>コンテナの先頭要素を指すイテレータを取得</strong> → <code>コンテナ.begin()</code></li>
<li><strong>コンテナの末尾の次の要素を指すイテレータを取得</strong> → <code>コンテナ.end()</code></li>
<li><strong>イテレータを1つ進める</strong> → <code>イテレータ++</code></li>
<li><strong>イテレータが指す要素にアクセスする</strong> → <code>*イテレータ</code></li>
<h3><span id="toc4">基本的なイテレータの使い方</span></h3>
</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>int main() {
  vector&lt;int&gt; a = {3, 1, 5, 6, 7, 2, 4};
  auto itr1 = a.begin();  // 先頭要素を指す
  itr1 = itr1 + 2;        // 3番目の要素 (a[2]) を指す
  auto itr2 = itr1 + 4;   // 7番目の要素 (a[6]) を指す</p>
  cout &lt;&lt; *itr1 &lt;&lt; endl;  // 5
  cout &lt;&lt; *itr2 &lt;&lt; endl;  // 4
}</code></pre>
<p><strong>出力結果</strong></p>
<pre><code>5
4</code></pre>
<p><h2><span id="toc5">イテレータを使ったループ処理</span></h2>
<p>イテレータを使って <code>vector</code> の要素を順番に出力する方法を見てみましょう。</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>int main() {
  vector&lt;int&gt; a = {1, 2, 3};</p>
  for (auto it = a.begin(); it != a.end(); it++) {
    cout &lt;&lt; *it &lt;&lt; endl;
  }
}</code></pre>
<p><strong>出力結果</strong></p>
<pre><code>1
2
3</code></pre>
<p><h2><span id="toc6">イテレータの各種操作</span></h2>
<h3><span id="toc7">イテレータの移動</span></h3>
</p>
<pre><code class="language-cpp">advance(イテレータ, k);  // k 個進める
prev(イテレータ, k);     // k 個前のイテレータを取得
next(イテレータ, k);     // k 個先のイテレータを取得</code></pre>
<p><h3><span id="toc8">イテレータの指す要素のメンバにアクセス</span></h3>
</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>int main() {
  vector&lt;pair&lt;int, int&gt;&gt; a = {{1, 4}, {2, 5}, {3, 6}};
  auto itr = a.begin() + 1;</p>
  cout &lt;&lt; itr-&gt;first &lt;&lt; ", " &lt;&lt; itr-&gt;second &lt;&lt; endl;
}</code></pre>
<p><strong>出力結果</strong></p>
<pre><code>2, 5</code></pre>
<p><h2><span id="toc9">イテレータの指す要素の削除</span></h2>
<p>イテレータを使用して <code>vector</code> の特定の要素を削除することもできます。</p>
<pre><code class="language-cpp">コンテナ.erase(イテレータ);</code></pre>
<p><h3><span id="toc10">注意点</span></h3>
<li><strong>削除後のイテレータは無効になるため、使用しないこと！</strong></li>
<li><strong>要素の追加・削除により、既存のイテレータは無効になる可能性がある</strong></li>
<h2><span id="toc11">まとめ</span></h2>
<li><strong>イテレータはコンテナの要素を操作するためのオブジェクト</strong></li>
<li><strong>イテレータを使うことでコンテナを柔軟に操作できる</strong></li>
<li><strong>イテレータの無効化に注意しながら、安全にコードを記述することが重要</strong></li>
<p>C++のイテレータを活用して、より効率的で柔軟なプログラムを書いてみましょう！</p><p>The post <a href="https://aichi.blog/iterator-and-usage/">イテレータの基本と活用方法を徹底解説！</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>構造体の基本とコンストラクタの使い方を徹底解説！</title>
		<link>https://aichi.blog/struct-and-constructor/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=struct-and-constructor</link>
		
		<dc:creator><![CDATA[愛知郎]]></dc:creator>
		<pubDate>Mon, 24 Feb 2025 14:09:30 +0000</pubDate>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[競技プログラミング]]></category>
		<guid isPermaLink="false">https://aichi.blog/struct-and-constructor/</guid>

					<description><![CDATA[<p>目次 はじめに構造体とは？構造体の基本構文例：異なる型をまとめるメンバ関数メンバ関数の定義メンバ関数の使用コンストラクタコンストラクタの基本形コンストラクタの使用例引数を持つコンストラクタまとめ はじめに C++の「構造 [&#8230;]</p>
<p>The post <a href="https://aichi.blog/struct-and-constructor/">構造体の基本とコンストラクタの使い方を徹底解説！</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">構造体とは？</a><ol><li><a href="#toc3" tabindex="0">構造体の基本構文</a></li><li><a href="#toc4" tabindex="0">例：異なる型をまとめる</a></li></ol></li><li><a href="#toc5" tabindex="0">メンバ関数</a><ol><li><a href="#toc6" tabindex="0">メンバ関数の定義</a></li><li><a href="#toc7" tabindex="0">メンバ関数の使用</a></li></ol></li><li><a href="#toc8" tabindex="0">コンストラクタ</a><ol><li><a href="#toc9" tabindex="0">コンストラクタの基本形</a></li><li><a href="#toc10" tabindex="0">コンストラクタの使用例</a></li></ol></li><li><a href="#toc11" tabindex="0">引数を持つコンストラクタ</a></li><li><a href="#toc12" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>C++の「構造体（struct）」は、複数の異なるデータ型をまとめて扱うための便利な機能です。本記事では、構造体の基本からメンバ関数、コンストラクタまでを詳しく解説し、実践的なサンプルコードを交えて学習します。</p>
<p><h2><span id="toc2">構造体とは？</span></h2>
<p>構造体を使うことで、複数のデータ型を1つの新しい型としてまとめることができます。</p>
<p><h3><span id="toc3">構造体の基本構文</span></h3>
</p>
<pre><code class="language-cpp">struct 構造体名 {
  型1 メンバ変数名1;
  型2 メンバ変数名2;
  型3 メンバ変数名3;
  // 必要なメンバ変数を追加
};  // ← セミコロンが必要</code></pre>
<p><h3><span id="toc4">例：異なる型をまとめる</span></h3>
</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>struct MyPair {
  int x;     // 整数型のデータ
  string y;  // 文字列型のデータ
};</p>
int main() {
  MyPair p = {12345, "hello"};  // MyPair型のオブジェクトを宣言
  cout &lt;&lt; "p.x = " &lt;&lt; p.x &lt;&lt; endl;
  cout &lt;&lt; "p.y = " &lt;&lt; p.y &lt;&lt; endl;
}</code></pre>
<p><strong>出力結果</strong></p>
<pre><code>p.x = 12345
p.y = hello</code></pre>
<p><h2><span id="toc5">メンバ関数</span></h2>
<p>構造体に「メンバ関数」を追加すると、構造体に関連する処理をカプセル化できます。</p>
<p><h3><span id="toc6">メンバ関数の定義</span></h3>
</p>
<pre><code class="language-cpp">struct MyPair {
  int x;
  string y;
  // メンバ関数
  void print() {
    cout &lt;&lt; "x = " &lt;&lt; x &lt;&lt; endl;
    cout &lt;&lt; "y = " &lt;&lt; y &lt;&lt; endl;
  }
};</code></pre>
<p><h3><span id="toc7">メンバ関数の使用</span></h3>
</p>
<pre><code class="language-cpp">int main() {
  MyPair p = {12345, "Hello"};
  p.print();  // メンバ関数の呼び出し
  MyPair q = {67890, "APG4b"};
  q.print();  // 別のオブジェクトでメンバ関数を呼び出し
}</code></pre>
<p><strong>出力結果</strong></p>
<pre><code>x = 12345
y = Hello
x = 67890
y = APG4b</code></pre>
<p><h2><span id="toc8">コンストラクタ</span></h2>
<p>構造体のオブジェクトが作成されるときに、自動的に実行される特別な関数を「コンストラクタ」といいます。</p>
<p><h3><span id="toc9">コンストラクタの基本形</span></h3>
</p>
<pre><code class="language-cpp">struct 構造体名 {
  // コンストラクタ
  構造体名() {
    // 初期化処理
  }
};</code></pre>
<p><h3><span id="toc10">コンストラクタの使用例</span></h3>
</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>struct MyPair {
  int x;
  string y;</p>
<p>// コンストラクタ
  MyPair() {
    cout &lt;&lt; "constructor called" &lt;&lt; endl;
  }
};</p>
int main() {
  MyPair p;  // オブジェクト生成時にコンストラクタが呼ばれる
  p.x = 12345;
  p.y = "hello";
  cout &lt;&lt; "p.x = " &lt;&lt; p.x &lt;&lt; endl;
  cout &lt;&lt; "p.y = " &lt;&lt; p.y &lt;&lt; endl;
}</code></pre>
<p><strong>出力結果</strong></p>
<pre><code>constructor called
p.x = 12345
p.y = hello</code></pre>
<p><h2><span id="toc11">引数を持つコンストラクタ</span></h2>
<p>コンストラクタに引数を渡すことで、オブジェクトの初期化をより柔軟に行えます。</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>struct NumString {
  int length;
  string s;</p>
<p>// コンストラクタ
  NumString(int num) {
    cout &lt;&lt; "constructor called" &lt;&lt; endl;
    s = to_string(num);  // 数値を文字列に変換
    length = s.size();
  }
};</p>
int main() {
  NumString num(12345);  // 12345を渡す
  cout &lt;&lt; "num.s = " &lt;&lt; num.s &lt;&lt; endl;
  cout &lt;&lt; "num.length = " &lt;&lt; num.length &lt;&lt; endl;
}</code></pre>
<p><strong>出力結果</strong></p>
<pre><code>constructor called
num.s = 12345
num.length = 5</code></pre>
<p><h2><span id="toc12">まとめ</span></h2>
<li><strong>構造体は異なるデータ型を1つにまとめることができる。</strong></li>
<li><strong>メンバ関数を定義すると、オブジェクトに紐づいた処理が可能。</strong></li>
<li><strong>コンストラクタを使うと、オブジェクトの初期化が簡単になる。</strong></li>
<li><strong>引数を持つコンストラクタを利用すると、柔軟な初期化が可能。</strong></li>
<p>構造体を活用して、より効率的で分かりやすいC++のプログラムを書いてみましょう！</p><p>The post <a href="https://aichi.blog/struct-and-constructor/">構造体の基本とコンストラクタの使い方を徹底解説！</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>参照の基本と参照渡しを活用する方法</title>
		<link>https://aichi.blog/reference-and-pass-by-reference/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=reference-and-pass-by-reference</link>
		
		<dc:creator><![CDATA[愛知郎]]></dc:creator>
		<pubDate>Mon, 24 Feb 2025 13:54:09 +0000</pubDate>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[競技プログラミング]]></category>
		<guid isPermaLink="false">https://aichi.blog/reference-and-pass-by-reference/</guid>

					<description><![CDATA[<p>目次 はじめに参照とは？参照の宣言と使用方法参照の特徴関数への参照渡し参照渡しとは？参照渡しのメリット関数で複数の値を返す参照を使ったパフォーマンス改善参照を使わない場合（時間がかかる）参照を使った場合（高速）まとめ は [&#8230;]</p>
<p>The post <a href="https://aichi.blog/reference-and-pass-by-reference/">参照の基本と参照渡しを活用する方法</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">参照とは？</a><ol><li><a href="#toc3" tabindex="0">参照の宣言と使用方法</a></li><li><a href="#toc4" tabindex="0">参照の特徴</a></li></ol></li><li><a href="#toc5" tabindex="0">関数への参照渡し</a><ol><li><a href="#toc6" tabindex="0">参照渡しとは？</a></li><li><a href="#toc7" tabindex="0">参照渡しのメリット</a></li><li><a href="#toc8" tabindex="0">関数で複数の値を返す</a></li></ol></li><li><a href="#toc9" tabindex="0">参照を使ったパフォーマンス改善</a><ol><li><a href="#toc10" tabindex="0">参照を使わない場合（時間がかかる）</a></li><li><a href="#toc11" tabindex="0">参照を使った場合（高速）</a></li></ol></li><li><a href="#toc12" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>C++の「参照」は、変数を効率的に扱うために非常に便利な機能です。本記事では、参照の基本的な使い方から、関数への参照渡し、パフォーマンス向上のためのテクニックまでを解説します。</p>
<p><h2><span id="toc2">参照とは？</span></h2>
<p>参照（Reference）は、既存の変数に別名をつける仕組みです。ポインタと異なり、NULL（ヌル）を指すことがなく、より直感的に扱うことができます。</p>
<p><h3><span id="toc3">参照の宣言と使用方法</span></h3>
</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;
<p>int main() {
  int a = 3;
  int &b = a;  // bは変数aの参照</p>
<p>cout &lt;&lt; "a: " &lt;&lt; a &lt;&lt; endl;  // aの値を出力（3）
  cout &lt;&lt; "b: " &lt;&lt; b &lt;&lt; endl;  // bの参照先の値を出力（3）</p>
<p>b = 4;  // 参照先の値を変更（aが4になる）</p>
  cout &lt;&lt; "a: " &lt;&lt; a &lt;&lt; endl;  // aの値を出力（4）
  cout &lt;&lt; "b: " &lt;&lt; b &lt;&lt; endl;  // bの参照先の値を出力（4）
}</code></pre>
<p><h3><span id="toc4">参照の特徴</span></h3>
<li><code>&</code> 記号を用いて参照を定義する。</li>
<li>参照を通じて値を変更すると、元の変数も変更される。</li>
<li>一度参照を定義すると、別の変数を参照することはできない。</li>
<h2><span id="toc5">関数への参照渡し</span></h2>
<h3><span id="toc6">参照渡しとは？</span></h3>
<p>関数の引数を参照として受け取ることで、コピーを作成せずに値を変更することができます。</p>
<pre><code class="language-cpp">int g(int &x) {
  x = x * 2;  // xの参照先（呼び出し元の変数）が変更される
  return x;
}
int main() {
  int a = 3;
  int b = g(a);  // xの参照先がaになる
  cout &lt;&lt; "a: " &lt;&lt; a &lt;&lt; endl;  // a: 6
  cout &lt;&lt; "b: " &lt;&lt; b &lt;&lt; endl;  // b: 6
}</code></pre>
<p><h3><span id="toc7">参照渡しのメリット</span></h3>
<li><strong>不要なコピーを防ぐ</strong> → パフォーマンス向上</li>
<li><strong>関数で複数の値を返す</strong></li>
<h3><span id="toc8">関数で複数の値を返す</span></h3>
<p>参照を使うことで、関数の戻り値とは別に複数の値を返すことができます。</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;
<p>void min_and_max(int a, int b, int c, int &minimum, int &maximum) {
  minimum = min(a, min(b, c));
  maximum = max(a, max(b, c));
}</p>
int main() {
  int minimum, maximum;
  min_and_max(3, 1, 5, minimum, maximum);
  cout &lt;&lt; "minimum: " &lt;&lt; minimum &lt;&lt; endl;  // 1
  cout &lt;&lt; "maximum: " &lt;&lt; maximum &lt;&lt; endl;  // 5
}</code></pre>
<p><h2><span id="toc9">参照を使ったパフォーマンス改善</span></h2>
<p>関数の引数を参照渡しにすることで、不要なコピーを減らし、処理速度を大幅に向上できます。</p>
<p><h3><span id="toc10">参照を使わない場合（時間がかかる）</span></h3>
</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
using namespace std;
<p>int sum100(vector&lt;int&gt; a) {  // 配列をコピー
  int result = 0;
  for (int i = 0; i &lt; 100; i++) {
    result += a.at(i);
  }
  return result;
}</p>
int main() {
  vector&lt;int&gt; vec(10000000, 1);
  for (int i = 0; i &lt; 500; i++) {
    cout &lt;&lt; sum100(vec) &lt;&lt; endl;  // 毎回コピーが発生（遅い）
  }
}</code></pre>
<p>この場合、<code>vec</code> が毎回コピーされるため、処理時間が <code>7813 ms</code> ほどかかります。</p>
<p><h3><span id="toc11">参照を使った場合（高速）</span></h3>
</p>
<pre><code class="language-cpp">int sum100(const vector&lt;int&gt; &a) {  // 参照渡し（コピーなし）
  int result = 0;
  for (int i = 0; i &lt; 100; i++) {
    result += a.at(i);
  }
  return result;
}</code></pre>
<p>これにより、処理時間が <code>15 ms</code> まで短縮されます。大量のデータを扱う場合、参照渡しを活用することで大幅なパフォーマンス改善が可能です。</p>
<p><h2><span id="toc12">まとめ</span></h2>
<li><strong>参照は変数の別名を作成する機能</strong></li>
<li><strong>関数の引数を参照にすると、値のコピーを防げる</strong></li>
<li><strong>複数の値を関数から返す際に便利</strong></li>
<li><strong>参照渡しを使うとパフォーマンスが向上する</strong></li>
<p>C++を効率よく使いこなすために、ぜひ参照を活用してください！</p><p>The post <a href="https://aichi.blog/reference-and-pass-by-reference/">参照の基本と参照渡しを活用する方法</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>C++のポインタとスマートポインタの使い方を徹底解説！</title>
		<link>https://aichi.blog/pointer-and-smart-pointer/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pointer-and-smart-pointer</link>
		
		<dc:creator><![CDATA[愛知郎]]></dc:creator>
		<pubDate>Mon, 24 Feb 2025 13:33:32 +0000</pubDate>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[競技プログラミング]]></category>
		<guid isPermaLink="false">https://aichi.blog/pointer-and-smart-pointer/</guid>

					<description><![CDATA[<p>目次 はじめにメモリとアドレスの基礎メモリとは？変数とメモリの関係sizeof 演算子で型のサイズを確認ポインタとは？ポインタの基本概念ポインタの宣言と使用方法メモリ領域の種類静的領域（Static Area）スタック領 [&#8230;]</p>
<p>The post <a href="https://aichi.blog/pointer-and-smart-pointer/">C++のポインタとスマートポインタの使い方を徹底解説！</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">メモリとアドレスの基礎</a><ol><li><a href="#toc3" tabindex="0">メモリとは？</a></li><li><a href="#toc4" tabindex="0">変数とメモリの関係</a></li></ol></li><li><a href="#toc5" tabindex="0">sizeof 演算子で型のサイズを確認</a></li><li><a href="#toc6" tabindex="0">ポインタとは？</a><ol><li><a href="#toc7" tabindex="0">ポインタの基本概念</a></li><li><a href="#toc8" tabindex="0">ポインタの宣言と使用方法</a></li></ol></li><li><a href="#toc9" tabindex="0">メモリ領域の種類</a><ol><li><a href="#toc10" tabindex="0">静的領域（Static Area）</a></li><li><a href="#toc11" tabindex="0">スタック領域（Stack Area）</a></li><li><a href="#toc12" tabindex="0">ヒープ領域（Heap Area）</a></li></ol></li><li><a href="#toc13" tabindex="0">ヒープ領域の確保と解放</a><ol><li><a href="#toc14" tabindex="0">ヒープ領域の確保</a></li><li><a href="#toc15" tabindex="0">ヒープ領域の解放</a></li><li><a href="#toc16" tabindex="0">配列の確保と解放</a></li></ol></li><li><a href="#toc17" tabindex="0">スマートポインタとは？</a><ol><li><a href="#toc18" tabindex="0">手動の delete は危険！</a></li><li><a href="#toc19" tabindex="0">スマートポインタのメリット</a></li></ol></li><li><a href="#toc20" tabindex="0">std::unique_ptr の使い方</a><ol><li><a href="#toc21" tabindex="0">基本の使用方法</a></li><li><a href="#toc22" tabindex="0">所有権の移動（move）</a></li></ol></li><li><a href="#toc23" tabindex="0">std::shared_ptr の使い方</a><ol><li><a href="#toc24" tabindex="0">複数のポインタで共有</a></li></ol></li><li><a href="#toc25" tabindex="0">まとめ</a></li><li><a href="#toc26" tabindex="0">よくある質問（FAQ）</a><ol><li><a href="#toc27" tabindex="0">Q1. ポインタと参照の違いは？</a></li><li><a href="#toc28" tabindex="0">Q2. std::weak_ptr はどんな時に使う？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>C++のポインタは、メモリ管理を理解し、効率的なプログラムを書く上で非常に重要な概念です。本記事では、ポインタの基本からスマートポインタまでを詳しく解説し、実践的なサンプルコードを通じて理解を深めます。</p>
<p><h2><span id="toc2">メモリとアドレスの基礎</span></h2>
<h3><span id="toc3">メモリとは？</span></h3>
<p>メモリは、プログラムが実行される際にデータを保存する領域です。メモリは巨大な配列のようなもので、各要素には一意のアドレス（メモリの位置）が割り当てられます。</p>
<p><h3><span id="toc4">変数とメモリの関係</span></h3>
<p>C++では、変数を宣言すると、その変数に対応するメモリ領域が確保されます。例えば、</p>
<pre><code class="language-cpp">int a = 10;</code></pre>
<p>このとき、変数 <code>a</code> に対応するメモリ領域が確保され、そのアドレスを調べるには <code>&</code> 演算子を使用します。</p>
<pre><code class="language-cpp">cout &lt;&lt; &a &lt;&lt; endl; // 変数aのアドレスを表示</code></pre>
<p><h2><span id="toc5">sizeof 演算子で型のサイズを確認</span></h2>
<p>メモリ上で各データ型がどれくらいのサイズを持つかを <code>sizeof</code> 演算子で調べることができます。</p>
<pre><code class="language-cpp">cout &lt;&lt; sizeof(int32_t) &lt;&lt; endl; // 4
cout &lt;&lt; sizeof(int8_t) &lt;&lt; endl;  // 1</code></pre>
<p>これは、整数型 <code>int32_t</code> が 4 バイト、<code>int8_t</code> が 1 バイトであることを示しています。</p>
<p><h2><span id="toc6">ポインタとは？</span></h2>
<h3><span id="toc7">ポインタの基本概念</span></h3>
<p>ポインタとは、変数のメモリアドレスを保持する特殊な変数です。ポインタ型の変数を使うことで、メモリ操作を直接行うことができます。</p>
<p><h3><span id="toc8">ポインタの宣言と使用方法</span></h3>
</p>
<pre><code class="language-cpp">int a = 42;
int *p = &a; // 変数aのアドレスをポインタpに格納
cout &lt;&lt; *p &lt;&lt; endl; // ポインタを使ってaの値を取得（42）</code></pre>
<li><code>int *p;</code> → <code>p</code> は <code>int</code> 型のデータを指すポインタ。</li>
<li><code>p = &a;</code> → <code>p</code> に変数 <code>a</code> のアドレスを格納。</li>
<li><code>*p</code> → <code>p</code> が指す変数 <code>a</code> の値を取得。</li>
<h2><span id="toc9">メモリ領域の種類</span></h2>
<p>C++のメモリは、以下の3つの領域に分かれます。</p>
<p><h3><span id="toc10">静的領域（Static Area）</span></h3>
<li>グローバル変数や静的変数が保存される領域。</li>
<li>プログラム開始時に確保され、終了時に解放。</li>
<h3><span id="toc11">スタック領域（Stack Area）</span></h3>
<li>ローカル変数や関数の引数が保存される領域。</li>
<li>関数の呼び出しとともに確保され、関数終了時に自動解放。</li>
<h3><span id="toc12">ヒープ領域（Heap Area）</span></h3>
<li><code>new</code> 演算子で動的にメモリを確保。</li>
<li><code>delete</code> で手動で解放が必要。</li>
<h2><span id="toc13">ヒープ領域の確保と解放</span></h2>
<h3><span id="toc14">ヒープ領域の確保</span></h3>
</p>
<pre><code class="language-cpp">int *p = new int; // 1つのint型の領域を確保
*p = 100;
cout &lt;&lt; *p &lt;&lt; endl; // 100</code></pre>
<p><h3><span id="toc15">ヒープ領域の解放</span></h3>
</p>
<pre><code class="language-cpp">delete p; // 確保したメモリを解放</code></pre>
<p><h3><span id="toc16">配列の確保と解放</span></h3>
</p>
<pre><code class="language-cpp">int *arr = new int[10]; // 10個分のメモリ確保
for (int i = 0; i &lt; 10; i++) arr[i] = i;
delete[] arr; // 配列用のdelete[]</code></pre>
<p><h2><span id="toc17">スマートポインタとは？</span></h2>
<h3><span id="toc18">手動の delete は危険！</span></h3>
<p>手動で <code>delete</code> を忘れるとメモリリークが発生し、プログラムの動作が不安定になります。</p>
<p><h3><span id="toc19">スマートポインタのメリット</span></h3>
<p>C++11以降では、<code>std::unique_ptr</code> や <code>std::shared_ptr</code> を使うことで、<code>delete</code> の必要がなくなり、安全にメモリ管理ができます。</p>
<p><h2><span id="toc20">std::unique_ptr の使い方</span></h2>
<h3><span id="toc21">基本の使用方法</span></h3>
</p>
<pre><code class="language-cpp">#include &lt;memory&gt;
int main() {
    std::unique_ptr&lt;int&gt; p1 = std::make_unique&lt;int&gt;(123);
    cout &lt;&lt; *p1 &lt;&lt; endl; // 123
}</code></pre>
<li><code>std::make_unique&lt;int&gt;(123);</code> → <code>int</code> 型の領域を確保し、123で初期化。</li>
<li><code>p1</code> がスコープを抜けると、自動的にメモリ解放。</li>
<h3><span id="toc22">所有権の移動（move）</span></h3>
</p>
<pre><code class="language-cpp">std::unique_ptr&lt;int&gt; p2;
p2 = std::move(p1); // p1 から p2 に所有権を移動</code></pre>
<p><h2><span id="toc23">std::shared_ptr の使い方</span></h2>
<h3><span id="toc24">複数のポインタで共有</span></h3>
</p>
<pre><code class="language-cpp">#include &lt;memory&gt;
int main() {
    std::shared_ptr&lt;int&gt; p1 = std::make_shared&lt;int&gt;(123);
    std::shared_ptr&lt;int&gt; p2 = p1; // 共有
    cout &lt;&lt; *p1 &lt;&lt; endl; // 123
    cout &lt;&lt; *p2 &lt;&lt; endl; // 123
}</code></pre>
<li><code>p1</code> と <code>p2</code> が同じメモリを参照。</li>
<li>どちらのポインタもスコープを抜けると、メモリが自動解放される。</li>
<h2><span id="toc25">まとめ</span></h2>
<li><strong>ポインタはメモリアドレスを扱う特殊な変数。</strong></li>
<li><strong>手動 <code>delete</code> はメモリリークの原因になるため、スマートポインタを活用すべき。</strong></li>
<li><strong><code>std::unique_ptr</code> は所有権を1つだけ持つ。</strong></li>
<li><strong><code>std::shared_ptr</code> は複数の所有者が存在できる。</strong></li>
<h2><span id="toc26">よくある質問（FAQ）</span></h2>
<h3><span id="toc27">Q1. ポインタと参照の違いは？</span></h3>
<p>参照 (<code>int& ref = a;</code>) はエイリアスで、NULL にはできません。ポインタは <code>nullptr</code> にでき、後から指す先を変更できます。</p>
<p><h3><span id="toc28">Q2. std::weak_ptr はどんな時に使う？</span></h3>
<p><code>std::shared_ptr</code> で循環参照を防ぐために使います。</p>
<hr>
<p>ポインタを正しく使うことで、C++のメモリ管理を自在に扱えるようになります。ぜひ実践してみてください！</p><p>The post <a href="https://aichi.blog/pointer-and-smart-pointer/">C++のポインタとスマートポインタの使い方を徹底解説！</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>C++のテンプレート完全ガイド：関数テンプレート・クラステンプレート・定数テンプレートを徹底解説</title>
		<link>https://aichi.blog/template-guide/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=template-guide</link>
		
		<dc:creator><![CDATA[愛知郎]]></dc:creator>
		<pubDate>Tue, 18 Feb 2025 13:03:38 +0000</pubDate>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[競技プログラミング]]></category>
		<guid isPermaLink="false">https://aichi.blog/template-guide/</guid>

					<description><![CDATA[<p>目次 1. はじめに2. 関数テンプレートとは？通常の関数との違い関数テンプレートの基本構文関数テンプレートの使い方3. クラステンプレートとは？クラステンプレートの基本構文クラステンプレートの使い方4. 定数のテンプレ [&#8230;]</p>
<p>The post <a href="https://aichi.blog/template-guide/">C++のテンプレート完全ガイド：関数テンプレート・クラステンプレート・定数テンプレートを徹底解説</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">1. はじめに</a></li><li><a href="#toc2" tabindex="0">2. 関数テンプレートとは？</a><ol><li><a href="#toc3" tabindex="0">通常の関数との違い</a></li><li><a href="#toc4" tabindex="0">関数テンプレートの基本構文</a></li><li><a href="#toc5" tabindex="0">関数テンプレートの使い方</a></li></ol></li><li><a href="#toc6" tabindex="0">3. クラステンプレートとは？</a><ol><li><a href="#toc7" tabindex="0">クラステンプレートの基本構文</a></li><li><a href="#toc8" tabindex="0">クラステンプレートの使い方</a></li></ol></li><li><a href="#toc9" tabindex="0">4. 定数のテンプレート</a><ol><li><a href="#toc10" tabindex="0">定数テンプレートの基本構文</a></li><li><a href="#toc11" tabindex="0">例：タプルの要素を交換する関数</a></li></ol></li><li><a href="#toc12" tabindex="0">5. まとめ</a><ol><li><a href="#toc13" tabindex="0">本記事のポイント</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">1. はじめに</span></h2>
<p>C++のテンプレートは、関数やクラスを汎用的に扱うための機能です。型を一般化することで、コードの再利用性を向上させることができます。</p>
<p>本記事では、C++のテンプレートの基本から実践的な使い方までを詳しく解説します。</p>
<p><h2><span id="toc2">2. 関数テンプレートとは？</span></h2>
<h3><span id="toc3">通常の関数との違い</span></h3>
<p>通常の関数では、異なる型に対して同じロジックを適用する場合、それぞれの型ごとに関数を定義する必要があります。</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>// int型の二乗を計算する関数
int square_int(int x) {
  return x * x;
}</p>
<p>// double型の二乗を計算する関数
double square_double(double x) {
  return x * x;
}</p>
<p>int main() {
  int a = 3;
  double b = 1.2;</p>
  cout &lt;&lt; square_int(a) &lt;&lt; endl;
  cout &lt;&lt; square_double(b) &lt;&lt; endl;
}</code></pre>
<p>この方法では、型ごとに関数を定義しなければならず、冗長になってしまいます。</p>
<p><h3><span id="toc4">関数テンプレートの基本構文</span></h3>
<p>テンプレートを使うことで、異なる型でも共通のロジックを持つ関数を一つにまとめることができます。</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>// 関数テンプレート
template &lt;typename T&gt;
T square(T x) {
  return x * x;
}</p>
<p>int main() {
  int a = 3;
  double b = 1.2;</p>
  cout &lt;&lt; square&lt;int&gt;(a) &lt;&lt; endl;   // int版のsquare関数
  cout &lt;&lt; square&lt;double&gt;(b) &lt;&lt; endl; // double版のsquare関数
}</code></pre>
<p><h3><span id="toc5">関数テンプレートの使い方</span></h3>
<p>関数テンプレートの呼び出し時には、<code>&lt;T&gt;</code>の部分を指定することで特定の型を適用できます。</p>
<pre><code class="language-cpp">関数名&lt;テンプレート引数&gt;(引数1, 引数2, ...);</code></pre>
<p>C++のコンパイラは型推論も行うため、明示的に <code>&lt;int&gt;</code> などを指定しなくても動作する場合があります。</p>
<p><h2><span id="toc6">3. クラステンプレートとは？</span></h2>
<h3><span id="toc7">クラステンプレートの基本構文</span></h3>
<p>クラステンプレートを使うと、異なる型を扱う構造体やクラスを共通のテンプレートとして定義できます。</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>// クラステンプレートの宣言
template &lt;typename T&gt;
struct Point {
  T x;
  T y;
  void print() {
    cout &lt;&lt; "(" &lt;&lt; x &lt;&lt; ", " &lt;&lt; y &lt;&lt; ")" &lt;&lt; endl;
  }
};</p>
<p>int main() {
  // int型のPoint構造体
  Point&lt;int&gt; p1 = {0, 1};
  p1.print();</p>
  // double型のPoint構造体
  Point&lt;double&gt; p2 = {2.3, 4.5};
  p2.print();
}</code></pre>
<p><h3><span id="toc8">クラステンプレートの使い方</span></h3>
</p>
<pre><code class="language-cpp">構造体名&lt;テンプレート引数&gt;</code></pre>
<p>クラステンプレートを使うことで、異なる型に対して同じロジックを適用することができます。</p>
<p><h2><span id="toc9">4. 定数のテンプレート</span></h2>
<p>C++では、定数にもテンプレートを適用できます。</p>
<p><h3><span id="toc10">定数テンプレートの基本構文</span></h3>
</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
const T 定数名 = 値;</code></pre>
<p><h3><span id="toc11">例：タプルの要素を交換する関数</span></h3>
<p>以下のコードは、テンプレートを利用してタプルの特定の要素を交換する関数を実装しています。</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>// タプルのINDEX1番目とINDEX2番目を交換する関数
template &lt;int INDEX1, int INDEX2&gt;
void tuple_swap(tuple&lt;int, int, int&gt; &x) {
  swap(get&lt;INDEX1&gt;(x), get&lt;INDEX2&gt;(x));
}</p>
<p>int main() {
  tuple&lt;int, int, int&gt; x = make_tuple(1, 2, 3);</p>
<p>tuple_swap&lt;0, 2&gt;(x);  // 1番目と3番目を交換
  cout &lt;&lt; get&lt;0&gt;(x) &lt;&lt; ", " &lt;&lt; get&lt;1&gt;(x) &lt;&lt; ", " &lt;&lt; get&lt;2&gt;(x) &lt;&lt; endl;</p>
  tuple_swap&lt;0, 1&gt;(x);  // 1番目と2番目を交換
  cout &lt;&lt; get&lt;0&gt;(x) &lt;&lt; ", " &lt;&lt; get&lt;1&gt;(x) &lt;&lt; ", " &lt;&lt; get&lt;2&gt;(x) &lt;&lt; endl;
}</code></pre>
<p><h2><span id="toc12">5. まとめ</span></h2>
<p>C++のテンプレートを活用することで、型に依存しない汎用的なコードを記述できるようになります。</p>
<p><h3><span id="toc13">本記事のポイント</span></h3>
<li><strong>関数テンプレート</strong> で同じ処理を異なる型に適用可能</li>
<li><strong>クラステンプレート</strong> で型に依存しないデータ構造を定義できる</li>
<li><strong>定数テンプレート</strong> で型を問わずに定数を定義可能</li>
<p>テンプレートの概念を理解し、実際の開発に活かしてみてください！</p><p>The post <a href="https://aichi.blog/template-guide/">C++のテンプレート完全ガイド：関数テンプレート・クラステンプレート・定数テンプレートを徹底解説</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>STLのコンテナとは？基本解説と実践的な使い方</title>
		<link>https://aichi.blog/stl-container/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=stl-container</link>
		
		<dc:creator><![CDATA[愛知郎]]></dc:creator>
		<pubDate>Mon, 17 Feb 2025 14:23:00 +0000</pubDate>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[競技プログラミング]]></category>
		<guid isPermaLink="false">https://aichi.blog/stl-container/</guid>

					<description><![CDATA[<p>C++の標準ライブラリであるSTL（Standard Template Library）には、さまざまなデータ構造（コンテナ）が含まれています。これらのコンテナを活用することで、効率的にデータを管理し、プログラムを簡潔に [&#8230;]</p>
<p>The post <a href="https://aichi.blog/stl-container/">STLのコンテナとは？基本解説と実践的な使い方</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>C++の標準ライブラリであるSTL（Standard Template Library）には、さまざまなデータ構造（コンテナ）が含まれています。これらのコンテナを活用することで、効率的にデータを管理し、プログラムを簡潔に記述することができます。</p>
<p>本記事では、STLの主要なコンテナについて、その特徴や基本操作、実践的なサンプルコードとともに解説していきます。</p>
<p>
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">1. STLのコンテナの種類</a><ol><li><a href="#toc2" tabindex="0">シーケンスコンテナ（Sequence Containers）</a></li><li><a href="#toc3" tabindex="0">連想コンテナ（Associative Containers）</a></li><li><a href="#toc4" tabindex="0">無順序連想コンテナ（Unordered Associative Containers）</a></li></ol></li><li><a href="#toc5" tabindex="0">2. map（連想配列）</a><ol><li><a href="#toc6" tabindex="0">mapの基本操作</a></li><li><a href="#toc7" tabindex="0">操作一覧</a></li></ol></li><li><a href="#toc8" tabindex="0">3. queue（待ち行列）</a><ol><li><a href="#toc9" tabindex="0">操作一覧</a></li></ol></li><li><a href="#toc10" tabindex="0">4. priority_queue（優先度付きキュー）</a><ol><li><a href="#toc11" tabindex="0">小さい順に取り出す priority_queue</a></li></ol></li><li><a href="#toc12" tabindex="0">5. set（集合）</a></li><li><a href="#toc13" tabindex="0">6. stack（スタック）</a></li><li><a href="#toc14" tabindex="0">7. lower_bound / upper_bound</a></li><li><a href="#toc15" tabindex="0">8. まとめ</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">1. STLのコンテナの種類</span></h2>
<p>STLのコンテナは大きく分けて3つのカテゴリーに分類されます。</p>
<p><h3><span id="toc2">シーケンスコンテナ（Sequence Containers）</span></h3>
<p>データを順番に格納するコンテナ。</p>
<li><code>std::vector</code>（動的配列）</li>
<li><code>std::deque</code>（両端キュー）</li>
<li><code>std::list</code>（双方向リスト）</li>
<li><code>std::forward_list</code>（単方向リスト）</li>
<li><code>std::array</code>（固定長配列）</li>
<h3><span id="toc3">連想コンテナ（Associative Containers）</span></h3>
<p>キーと値のペアを管理するコンテナ。</p>
<li><code>std::map</code>（キーの順序を保持）</li>
<li><code>std::multimap</code>（キーの重複を許可）</li>
<li><code>std::set</code>（重複を許さない集合）</li>
<li><code>std::multiset</code>（重複を許可する集合）</li>
<h3><span id="toc4">無順序連想コンテナ（Unordered Associative Containers）</span></h3>
<p>ハッシュテーブルを使用した連想コンテナ。</p>
<li><code>std::unordered_map</code>（順序なしのマップ）</li>
<li><code>std::unordered_multimap</code>（順序なし・キー重複可）</li>
<li><code>std::unordered_set</code>（順序なし集合）</li>
<li><code>std::unordered_multiset</code>（順序なし・重複可）</li>
<p><h2><span id="toc5">2. map（連想配列）</span></h2>
<h3><span id="toc6">mapの基本操作</span></h3>
<p><code>map</code> はキーと値のペアを管理する連想配列であり、辞書のようなデータ構造です。</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>int main() {
  map&lt;string, int&gt; score;
  score["Alice"] = 100;
  score["Bob"] = 89;
  score["Charlie"] = 95;</p>
  cout &lt;&lt; score.at("Alice") &lt;&lt; endl;
  cout &lt;&lt; score.at("Bob") &lt;&lt; endl;
  cout &lt;&lt; score.at("Charlie") &lt;&lt; endl;
}</code></pre>
<p><h3><span id="toc7">操作一覧</span></h3>
<li>値の追加：<code>map[key] = value;</code> （O(logN)）</li>
<li>値の削除：<code>map.erase(key);</code> （O(logN)）</li>
<li>値の取得：<code>map.at(key);</code> （O(logN)）</li>
<li>所属判定：<code>map.count(key);</code> （O(logN)）</li>
<li>要素数の取得：<code>map.size();</code> （O(1)）</li>
<p><h2><span id="toc8">3. queue（待ち行列）</span></h2>
<p><code>queue</code> は先入れ先出し（FIFO）のデータ構造です。</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>int main() {
  queue&lt;int&gt; q;
  q.push(10);
  q.push(3);
  q.push(6);
  q.push(1);</p>
  while (!q.empty()) {
    cout &lt;&lt; q.front() &lt;&lt; endl;
    q.pop();
  }
}</code></pre>
<p><h3><span id="toc9">操作一覧</span></h3>
<li>要素の追加：<code>queue.push(value);</code> （O(1)）</li>
<li>先頭要素の取得：<code>queue.front();</code> （O(1)）</li>
<li>先頭要素の削除：<code>queue.pop();</code> （O(1)）</li>
<li>要素数の取得：<code>queue.size();</code> （O(1)）</li>
<p><h2><span id="toc10">4. priority_queue（優先度付きキュー）</span></h2>
<p><code>priority_queue</code> は最大値（または最小値）を素早く取得できるデータ構造です。</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>int main() {
  priority_queue&lt;int&gt; pq;
  pq.push(10);
  pq.push(3);
  pq.push(6);
  pq.push(1);</p>
  while (!pq.empty()) {
    cout &lt;&lt; pq.top() &lt;&lt; endl;
    pq.pop();
  }
}</code></pre>
<p><h3><span id="toc11">小さい順に取り出す priority_queue</span></h3>
</p>
<pre><code class="language-cpp">priority_queue&lt;int, vector&lt;int&gt;, greater&lt;int&gt;&gt; pq;</code></pre>
<p><h2><span id="toc12">5. set（集合）</span></h2>
<p><code>set</code> は重複のないデータの集合を扱うコンテナです。</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>int main() {
  set&lt;int&gt; S;
  S.insert(3);
  S.insert(7);
  S.insert(8);
  S.insert(10);
  S.insert(3);</p>
  cout &lt;&lt; "size: " &lt;&lt; S.size() &lt;&lt; endl;
  if (S.count(7)) cout &lt;&lt; "found 7" &lt;&lt; endl;
}</code></pre>
<p><h2><span id="toc13">6. stack（スタック）</span></h2>
<p><code>stack</code> は後入れ先出し（LIFO）のデータ構造です。</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
<p>int main() {
  stack&lt;int&gt; s;
  s.push(10);
  s.push(1);
  s.push(3);</p>
  cout &lt;&lt; s.top() &lt;&lt; endl;
  s.pop();
  cout &lt;&lt; s.top() &lt;&lt; endl;
}</code></pre>
<p><h2><span id="toc14">7. lower_bound / upper_bound</span></h2>
<p>二分探索を利用してソート済み配列内の要素を検索します。</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;
using namespace std;
int main() {
  vector&lt;int&gt; a = {0, 10, 13, 14, 20};
  cout &lt;&lt; *lower_bound(a.begin(), a.end(), 12) &lt;&lt; endl;
  cout &lt;&lt; *upper_bound(a.begin(), a.end(), 10) &lt;&lt; endl;
}</code></pre>
<p><h2><span id="toc15">8. まとめ</span></h2>
<p>STLのコンテナは、適切なデータ構造を選択することで、より効率的なプログラムを書くことができます。各コンテナの特性を理解し、適材適所で活用しましょう！</p><p>The post <a href="https://aichi.blog/stl-container/">STLのコンテナとは？基本解説と実践的な使い方</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>C++の標準ライブラリ（STL）を活用した便利な関数解説</title>
		<link>https://aichi.blog/cpp-stl-functions/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cpp-stl-functions</link>
		
		<dc:creator><![CDATA[愛知郎]]></dc:creator>
		<pubDate>Sun, 16 Feb 2025 12:33:38 +0000</pubDate>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[競技プログラミング]]></category>
		<guid isPermaLink="false">https://aichi.blog/cpp-stl-functions-2/</guid>

					<description><![CDATA[<p>目次 はじめにmin関数で最小値を取得min関数の基本的な使い方型の違いによるエラーの注意点max関数で最大値を取得max関数の基本的な使い方swap関数で値を入れ替える2つの変数の値を交換する方法sort関数とreve [&#8230;]</p>
<p>The post <a href="https://aichi.blog/cpp-stl-functions/">C++の標準ライブラリ（STL）を活用した便利な関数解説</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">min関数で最小値を取得</a><ol><li><a href="#toc3" tabindex="0">min関数の基本的な使い方</a></li><li><a href="#toc4" tabindex="0">型の違いによるエラーの注意点</a></li></ol></li><li><a href="#toc5" tabindex="0">max関数で最大値を取得</a><ol><li><a href="#toc6" tabindex="0">max関数の基本的な使い方</a></li></ol></li><li><a href="#toc7" tabindex="0">swap関数で値を入れ替える</a><ol><li><a href="#toc8" tabindex="0">2つの変数の値を交換する方法</a></li></ol></li><li><a href="#toc9" tabindex="0">sort関数とreverse関数で配列を操作する</a><ol><li><a href="#toc10" tabindex="0">sort関数で昇順ソート</a></li><li><a href="#toc11" tabindex="0">reverse関数で降順ソート</a></li></ol></li><li><a href="#toc12" tabindex="0">STL関数の応用と注意点</a><ol><li><a href="#toc13" tabindex="0">STL関数の組み合わせ</a></li><li><a href="#toc14" tabindex="0">型の扱いに注意</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>C++にはSTL（Standard Template Library）と呼ばれる標準ライブラリが用意されており、これを活用することでプログラムの可読性と効率性を向上させることができます。本記事では、STLに含まれる便利な関数 <strong>min</strong>, <strong>max</strong>, <strong>swap</strong>, <strong>sort</strong>, <strong>reverse</strong> を解説し、それぞれの使い方や注意点を紹介します。</p>
<p><h2><span id="toc2">min関数で最小値を取得</span></h2>
<h3><span id="toc3">min関数の基本的な使い方</span></h3>
<p><code>min</code> 関数は、2つの値を比較し、そのうち小さい方の値を返します。使用するには <code>&lt;algorithm&gt;</code> ヘッダをインクルードする必要があります。</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
using namespace std;
int main() {
    int answer = min(3, 5);
    cout &lt;&lt; answer &lt;&lt; endl; // 3
}</code></pre>
<p>この例では <code>min(3, 5)</code> により <code>3</code> が返され、出力されます。</p>
<p><h3><span id="toc4">型の違いによるエラーの注意点</span></h3>
<p><code>min</code> 関数は、<strong>同じ型の値</strong> を比較する必要があります。異なる型を比較しようとすると、コンパイルエラーが発生します。</p>
<pre><code class="language-cpp">int main() {
    double answer = min(2.12, 5); // エラー！
    cout &lt;&lt; answer &lt;&lt; endl;
}</code></pre>
<p>このコードは <code>2.12</code>（double型）と <code>5</code>（int型）を比較しようとするため、型の不一致によりコンパイルエラーが発生します。エラーを避けるには、型を統一する必要があります。</p>
<pre><code class="language-cpp">int main() {
    double answer = min(2.12, 5.34); // OK
    cout &lt;&lt; answer &lt;&lt; endl; // 2.12
}</code></pre>
<p><h2><span id="toc5">max関数で最大値を取得</span></h2>
<h3><span id="toc6">max関数の基本的な使い方</span></h3>
<p><code>max</code> 関数は <code>min</code> 関数と同様に、2つの値を比較して大きい方の値を返します。</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
using namespace std;
int main() {
    int answer = max(3, 5);
    cout &lt;&lt; answer &lt;&lt; endl; // 5
}</code></pre>
<p>この例では <code>max(3, 5)</code> により <code>5</code> が返され、出力されます。<code>min</code> 関数と同じく、比較する値の型を統一する必要がある点に注意してください。</p>
<p><h2><span id="toc7">swap関数で値を入れ替える</span></h2>
<h3><span id="toc8">2つの変数の値を交換する方法</span></h3>
<p><code>swap</code> 関数を使うことで、2つの変数の値を簡単に入れ替えることができます。</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
using namespace std;
int main() {
    int a = 3;
    int b = 5;
    swap(a, b);
    cout &lt;&lt; a &lt;&lt; endl; // 5
    cout &lt;&lt; b &lt;&lt; endl; // 3
}</code></pre>
<p>このコードでは、<code>swap(a, b)</code> によって <code>a</code> と <code>b</code> の値が入れ替わり、<code>a</code> は <code>5</code>、<code>b</code> は <code>3</code> となります。</p>
<p><h2><span id="toc9">sort関数とreverse関数で配列を操作する</span></h2>
<h3><span id="toc10">sort関数で昇順ソート</span></h3>
<p><code>sort</code> 関数を使用すると、配列やベクターを昇順（小さい順）に並び替えることができます。</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using namespace std;
<p>int main() {
    vector&lt;int&gt; vec = {2, 5, 2, 1};
    sort(vec.begin(), vec.end()); // {1, 2, 2, 5}</p>
    for (int i = 0; i &lt; vec.size(); i++) {
        cout &lt;&lt; vec.at(i) &lt;&lt; " ";
    }
    cout &lt;&lt; endl;
}</code></pre>
<p><h3><span id="toc11">reverse関数で降順ソート</span></h3>
<p><code>reverse</code> 関数を使うと、要素の順番を反転させることができます。<code>sort</code> 関数と組み合わせることで降順（大きい順）に並び替えることが可能です。</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using namespace std;
<p>int main() {
    vector&lt;int&gt; vec = {2, 5, 2, 1};
    sort(vec.begin(), vec.end()); // {1, 2, 2, 5}
    reverse(vec.begin(), vec.end()); // {5, 2, 2, 1}</p>
    for (int i = 0; i &lt; vec.size(); i++) {
        cout &lt;&lt; vec.at(i) &lt;&lt; " ";
    }
    cout &lt;&lt; endl;
}</code></pre>
<p><h2><span id="toc12">STL関数の応用と注意点</span></h2>
<h3><span id="toc13">STL関数の組み合わせ</span></h3>
<p>STLの関数は単体で使うだけでなく、複数を組み合わせて効率的にデータを処理することができます。</p>
<p>例えば、<code>min</code> と <code>max</code> を使ってベクター内の最小値と最大値を取得することが可能です。</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using namespace std;
<p>int main() {
    vector&lt;int&gt; vec = {3, 1, 4, 1, 5, 9};
    int min_val = *min_element(vec.begin(), vec.end());
    int max_val = *max_element(vec.begin(), vec.end());</p>
    cout &lt;&lt; "Min: " &lt;&lt; min_val &lt;&lt; endl;
    cout &lt;&lt; "Max: " &lt;&lt; max_val &lt;&lt; endl;
}</code></pre>
<p><h3><span id="toc14">型の扱いに注意</span></h3>
<p>STLの関数を使用する際には、比較するデータ型を統一することが重要です。異なる型を比較するとコンパイルエラーの原因になります。</p>
<p>&#8212;</p>
<p>これらの関数を適切に使うことで、より効率的で可読性の高いC++プログラムを作成することができます。</p><p>The post <a href="https://aichi.blog/cpp-stl-functions/">C++の標準ライブラリ（STL）を活用した便利な関数解説</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>C++のコンパイルと実行の基礎知識</title>
		<link>https://aichi.blog/cpp-compilation-basics/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cpp-compilation-basics</link>
		
		<dc:creator><![CDATA[愛知郎]]></dc:creator>
		<pubDate>Sat, 15 Feb 2025 14:32:08 +0000</pubDate>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[競技プログラミング]]></category>
		<guid isPermaLink="false">https://aichi.blog/cpp-compilation-basics/</guid>

					<description><![CDATA[<p>目次 1. C++の基本的なヘッダファイルiostream ヘッダbits/stdc++.h について2. 名前空間（namespace）の使用3. コンパイルと実行基本的なコンパイルコマンド代替的な実行方法4. コンパ [&#8230;]</p>
<p>The post <a href="https://aichi.blog/cpp-compilation-basics/">C++のコンパイルと実行の基礎知識</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">1. C++の基本的なヘッダファイル</a><ol><li><a href="#toc2" tabindex="0">iostream ヘッダ</a></li><li><a href="#toc3" tabindex="0">bits/stdc++.h について</a></li></ol></li><li><a href="#toc4" tabindex="0">2. 名前空間（namespace）の使用</a></li><li><a href="#toc5" tabindex="0">3. コンパイルと実行</a><ol><li><a href="#toc6" tabindex="0">基本的なコンパイルコマンド</a></li><li><a href="#toc7" tabindex="0">代替的な実行方法</a></li></ol></li><li><a href="#toc8" tabindex="0">4. コンパイルとビルドの違い</a><ol><li><a href="#toc9" tabindex="0">コンパイル</a></li><li><a href="#toc10" tabindex="0">ビルド</a></li></ol></li><li><a href="#toc11" tabindex="0">5. 他言語との比較</a><ol><li><a href="#toc12" tabindex="0">Go 言語（コンパイル言語）</a></li><li><a href="#toc13" tabindex="0">Python（インタプリタ言語）</a></li></ol></li><li><a href="#toc14" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">1. C++の基本的なヘッダファイル</span></h2>
<h3><span id="toc2">iostream ヘッダ</span></h3>
<p>C++でプログラムを書く際、最も基本的なヘッダファイルの一つが <code>iostream</code> です。</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;</code></pre>
<p>このヘッダファイルには以下の機能が含まれています：</p>
<ul>
<li><code>cout</code>：標準出力</li>
<li><code>endl</code>：改行</li>
<li>その他の入出力関連の機能</li>
</ul>
<h3><span id="toc3">bits/stdc++.h について</span></h3>
<p>競技プログラミングでよく見かける以下のインクルード文について説明します：</p>
<pre><code class="language-cpp">#include &lt;bits/stdc++.h&gt;</code></pre>
<p>これは全てのヘッダファイルをインクルードする便利な方法ですが、以下の理由から実務では非推奨です：</p>
<ul>
<li>ビルド時間の増加</li>
<li>メモリ使用量の増加</li>
<li>依存関係の不透明化</li>
</ul>
<h2><span id="toc4">2. 名前空間（namespace）の使用</span></h2>
<p>C++では名前の衝突を避けるために名前空間を使用します。標準ライブラリの機能は <code>std</code> 名前空間に属しています。</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;  // std名前空間を使用
int main() {
    cout &lt;&lt; "Hello, World!" &lt;&lt; endl;  // std::を省略可能
    return 0;
}</code></pre>
<h2><span id="toc5">3. コンパイルと実行</span></h2>
<h3><span id="toc6">基本的なコンパイルコマンド</span></h3>
<pre><code class="language-shell">g++ main.cpp -o main &amp;&amp; ./main</code></pre>
<p>このコマンドの内訳：</p>
<ul>
<li><code>g++</code>：C++コンパイラ</li>
<li><code>main.cpp</code>：ソースファイル</li>
<li><code>-o main</code>：出力ファイル名の指定</li>
<li><code>&amp;&amp;</code>：コマンドの連結</li>
<li><code>./main</code>：実行</li>
</ul>
<h3><span id="toc7">代替的な実行方法</span></h3>
<pre><code class="language-shell">g++ main.cpp &amp;&amp; ./a.out</code></pre>
<p>または</p>
<pre><code class="language-shell">g++ main.cpp -o main
./main</code></pre>
<h2><span id="toc8">4. コンパイルとビルドの違い</span></h2>
<h3><span id="toc9">コンパイル</span></h3>
<ul>
<li>ソースコードを機械語に変換する工程</li>
<li>例：<code>g++ main.cpp</code></li>
</ul>
<h3><span id="toc10">ビルド</span></h3>
<ul>
<li>コンパイルとリンクを含む総合的な工程</li>
<li>例：<code>g++ main.cpp -o main</code></li>
<li>以下の工程を含むことがある：</li>
</ul>
<ul>
<li style="list-style-type: none;">
<ul>
<li>コンパイル</li>
<li>依存関係の解決</li>
<li>リンク</li>
<li>テスト</li>
<li>デプロイ</li>
</ul>
</li>
</ul>
<h2><span id="toc11">5. 他言語との比較</span></h2>
<h3><span id="toc12">Go 言語（コンパイル言語）</span></h3>
<pre><code class="language-shell">go run main.go</code></pre>
<ul>
<li>コンパイルと実行を 1 つのコマンドで実行可能</li>
</ul>
<h3><span id="toc13">Python（インタプリタ言語）</span></h3>
<pre><code class="language-shell">python main.py</code></pre>
<ul>
<li>コンパイル不要</li>
<li>実行時に逐次解釈</li>
<li>必要に応じてバイトコードに変換（.pyc ファイル）</li>
</ul>
<h2><span id="toc14">まとめ</span></h2>
<p>C++は強力な言語ですが、コンパイル言語としての特性上、実行までの手順が他の言語と比べて複雑です。しかし、この複雑さは実行時のパフォーマンスという形で還元されます。基本的な開発フローを理解することで、より効率的なプログラミングが可能になります。</p><p>The post <a href="https://aichi.blog/cpp-compilation-basics/">C++のコンパイルと実行の基礎知識</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
