WHAT'S NEW
- 2024/07/18 Yet Another C++ Problems の CSS を修正
- 2024/07/17 中級編と応用編の CSS を修正
- 2024/07/16 初級編の CSS を修正
お気楽C++プログラミング超入門
CONTENTS
お気楽C++プログラミング超入門のフォントを Web フォント (Noto Sans JP, Noto Sans Mono) に変更し、印刷用の CSS を追加しました。Web ブラウザの印刷機能を使って PDF に変換することもできます。表示が崩れるときはフォント Noto Sans Mono CJK JP をインストールしてください。
●初級編
- 2023/04/09 C++の基礎知識 (1)
こんにちはC++、数と四則演算、局所変数と大域変数、文字と文字列、if 文、比較演算子と論理演算子、三項演算子、while 文による繰り返し、インクリメント演算子とデクリメント演算子、FizzBizz 問題、数値積分
- 2023/04/09 C++の基礎知識 (2)
配列、for 文、範囲 for 文、繰り返しの制御、パスカルの三角形、素数を求める、エラトステネスの篩、素因数分解、switch 文
- 2023/04/09 関数
関数の基礎知識、関数の定義方法、局所変数と大域変数、局所変数の定義と有効範囲、デフォルト引数、関数の多重定義、多重定義の曖昧さ、整数の和、累乗の計算、素数を求める (2)、平方根の計算、平方根の整数部分を求める、めのこ平方
- 2023/04/09 再帰定義
再帰定義の基本、再帰定義のポイント、ユークリッドの互除法、相互再帰と関数プロトタイプ、末尾再帰と繰り返し、めのこ平方の改良、順列の生成、Appendix: 末尾最適化
- 2023/04/09 ポインタ (前編)
メモリの構成、ポインタの基本、ポインタの利点と欠点、配列とポインタ、Cスタイル文字列、値呼びと参照呼び、関数にポインタを渡す
- 2023/04/09 ポインタ (後編)
参照 (リファレンス)、配列と関数、多段階のポインタ、ポインタ配列、関数へのポインタ、typedef でデータ型に別名を付ける、void ポインタ、qsort と bsearch、Appendix: 参照呼び
- 2023/04/09 C++のメモリアロケーション
スタックとは?、関数呼び出しとスタックの関係、局所変数とスタックの関係、スタック領域について、動的メモリ割り当て、new と delete、簡単な使用例
- 2023/04/09 ソート
シェルソート、クイックソート、クイックソートの欠点、マージソート
- 2023/04/09 構造体
構造体の定義、構造体の使い方、構造体とポインタ、構造体と配列、共用体、無名の構造体/共用体
- 2023/04/09 オブジェクト指向の基礎知識 (前編)
オブジェクトとは?、クラスとインスタンス、メソッド、C++のクラス、インスタンスとメンバ変数、メンバ関数、コンストラクタ、初期化と代入の違い、Point クラス、Point3d クラス
- 2023/04/09 オブジェクト指向の基礎知識 (後編)
変換コンストラクタ、クラスと配列、デストラクタ、コピーコンストラクタ、演算子の多重定義、代入演算子の多重定義、変換演算子、静的メンバ変数、静的メンバ関数、有理数 (分数)
- 2023/04/09 継承
継承とは?、単一継承、多重継承、継承の仕組み、単一継承の使い方、オーバーライド、データ型の継承、仮想関数とポリモーフィズム、仮想デストラクタ、純粋仮想関数と抽象クラス、キャストとポリモーフィズム
●中級編
- 2023/04/09 例外処理
例外の捕捉、例外の送出、大域脱出、例外クラス、例外クラスの定義、例外処理とデストラクタ
- 2023/04/09 ベクタクラスの作成
ベクタクラスの定義、メンバ関数の定義、簡単な実行例、イテレータ、内部クラス、クラス Iterator の定義、簡単な実行例 (2)、高階関数によるアクセス、関数オブジェクト、ジェネレータ
- 2023/04/09 連結リスト
連結リストの構造、クラスの定義、作業用の静的メンバ関数、データの取得と更新、データの挿入、データの削除、データのクリア、コピーコンストラクタと代入演算子、イテレータ、ジェネレータ、高階関数、実行例、分割コンパイル、ヘッダファイルの定義、実行ファイルの作成
- 2023/04/09 二分探索木
木構造、二分木、節の定義、データの探索、データの挿入、データの削除、最小値の探索と削除、データ削除のプログラム、巡回 (traverse)、節のコピーと廃棄、クラス IntTree とメンバ関数の定義、イテレータ、ジェネレータ、簡単なテスト
- 2023/04/09 テンプレートの基礎知識
テンプレートの定義、クラステンプレート、関数テンプレート、Pair の作成、テンプレートのデフォルト引数、テンプレートの特殊化、テンプレートの部分特殊化、テンプレート関数の特殊化、テンプレートと高階関数、イテレータと高階関数
- 2023/04/09 標準ライブラリの基礎知識 (vector 編)
vector とは?、データの追加と取り出し、C++のイテレータ、vector のイテレータ、データの挿入と削除、algorithm の関数、データの探索、ソート、畳み込み、二次元配列、インスタンスを格納するときの注意点
- 2023/04/09 標準ライブラリの基礎知識 (list 編)
双方向リストとは?、list の宣言と初期化、データの追加と取り出し、list のイテレータ、データの挿入と削除、リスト操作に適した関数、リストのマージ
- 2023/04/09 標準ライブラリの基礎知識 (map 編)
連想配列とは?、map の宣言と初期化、map のイテレータ、データの探索、データの挿入、データの削除、テンプレートで比較関数を指定する
- 2023/04/09 キュー
キューとは?、リングバッファによるキューの実装、クラス Queue の定義、データの挿入、データの取り出し、実行例、ディーキュー (deque)、ディーキューの定義、データの挿入、データの削除、データの参照、添字演算子の多重定義、簡単なテスト、コンテナ deque の使い方、アダプタ queue の使い方
- 2023/04/09 右辺値参照
左辺値と右辺値、右辺値参照、所有権の移動、ムーブコンストラクタとムーブ代入演算子、コンテナクラスとムーブ代入演算子、Emplacement
- 2023/04/09 スマートポインタ
スマートポインタとは?、unique_ptr の基本的な使い方、配列を所持する方法、コンテナクラスに unique_ptr を格納する、その他のメンバ関数
●応用編
- 2023/04/15 経路の探索
グラフ、隣接行列と隣接リスト、バックトラックによる探索、幅優先探索、経路の管理、幅優先探索のプログラム、反復深化、反復深化のプログラム
- 2023/04/15 ラムダ式
ラムダ式の構文、レキシカルスコープ、局所変数のキャプチャ、クロージャ、ジェネレータ
- 2023/04/15 ベクタクラスの作成 (テンプレート編)
Vector クラスの定義、メンバ関数の定義、イテレータの定義、簡単なテスト
- 2023/04/15 連結リスト (テンプレート編)
セル Cell と連結リスト List の定義、メンバ関数の定義、イテレータの定義、簡単なテスト
- 2023/04/15 二分探索木 (テンプレート編)
節 Node と二分木 Tree の定義、イテレータの定義、簡単なテスト
- 2023/04/15 ファイル入出力
標準入出力の使い方、ifstream と ofstream、改行文字の取り扱い、コマンドライン引数の取得、read() と write()、マニュピレータ、整数の入出力、浮動小数点数の出力、文字列ストリーム、ファイルを行単位で連結する
- 2023/04/15 文字列 (string)
string の宣言と初期化、要素のアクセス、string のイテレータ、文字列の連結、文字列の挿入、文字列の削除、文字列の探索、文字列の置換、部分文字列の取得、Cスタイル文字列への変換
- 2023/04/15 タプル (tuple)
タプルとは?、make_tuple() によるタプルの生成、タプルにポインタや参照を格納する、タプルの要素を取り出す、タプルで多値を返す
- 2023/04/15 整数の論理演算とビット操作
ビット演算子、組み合わせの生成、組み合わせに番号を付ける、組み合わせを番号に変換、番号を組み合わせに変換、ちょっと便利なビット操作、ビットが 1 の個数を求める
- 2023/04/15 N Queens Problem
単純な解法の問題点、無駄を省く、実行結果 (1)、プログラムの改良、実行結果 (2)、ビット演算による高速化、実行結果 (3)
- 2023/04/15 unordered_map
ハッシュ法の仕組み、チェイン法、オープンアドレス法、データの挿入と探索、データの削除、オープンアドレス法の問題点、unordered_map の使い方、unoredered_map のイテレータ、データの探索、データの挿入、データの削除、ハッシュ関数と叙述関数の設定
- 2023/04/15 スライドパズル
パズルの説明 (8 パズル)、データ構造の定義、同一局面のチェック、幅優先探索による解法、実行結果、双方向探索、最長手数の求め方、プログラムの作成、実行結果 (2)
- 2023/04/15 スライドパズル (2)
反復深化による解法、実行結果、下限値枝刈り法、下限値枝刈り法のプログラム、手数の遇奇性、11 パズルの解法
- 2023/04/15 ヒープ
ヒープとは?、ヒープの構築 (1)、ヒープの再構築、ヒープの構築 (2)、優先度つき待ち行列、プログラムの作成、実行例、ヒープソート、priority_queue の使い方
- 2023/04/15 多重継承
多重継承の使い方、メンバ変数の衝突、メンバ関数の衝突、仮想基底クラス、菱形継承とメンバ関数、菱形継承におけるメンバ関数の曖昧さ、Mix-in、Enumerable
- 2023/04/15 複素数と複素関数
C++の数、無限大、負のゼロ、非数、C++の複素数、複素数の四則演算、複素数の指数関数と対数関数、複素数の三角関数、複素数の双曲線関数、複素数の平方根、逆三角関数、複素数の逆三角関数、逆双曲線関数、複素数の逆双曲線関数
●Yet Another C++ Problems
はじめに
『お気楽C++プログラミング超入門』は M.Hiroi が Linux でC++を学習するために作成したページです。昔々、M.Hiroi はC++を少しだけかじったことがありますが、難しくて歯がたちませんでした。その後ぜんぜん勉強していなかったので、今では初心者とまったく同じような状態です。
そこで、今回は脱初心者を目指して、簡単なプログラムを作りながら少しずつC++の勉強を進めていきたいと思っております。なにぶんにも初心者が作るページなので、間違いがあるかもしれません。お気づきの点がありましたら、メールでご指摘いただけると助かります。たいしたことはできませんが、よろしければお付き合いくださいませ。
●C++とは?
C++は 1982 年 AT&T ベル研究所の Bjarn Stroustrup 氏によって開発された、C言語にオブジェクト指向機能を追加したプログラミング言語です。現在、最も多く利用されているプログラミング言語の一つです。オブジェクト指向だけではなく、テンプレートによるジェネリック・プログラミングなどもサポートされています。
C++は度重なる機能追加により、その言語仕様はとても複雑になってしまいました。このため、初心者がオブジェクト指向を学ぶには適していないと言われています。M.Hiroi はシンプルな言語を好むので、C++は難しい言語だと思っております。まあ、C++はなんでもできるプログラミング言語、いわゆるプロフェッショナルツールなので、M.Hiroi のようなちょっと勉強しただけの初心者では、歯がたたないのは当然のことなのかもしれません。
●g++ と clang++
Unix 系 OS で利用できるC++コンパイラでは、Free Software Foundation が開発している g++ が有名です。Debian 系の OS であれば、次のコマンドで g++ をインストールすることができます。
sudo apt intstall g++
$ g++ --version
g++ (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
近年では Clang というコンパイラも使われるようになってきました。M.Hiroi は Clang に興味があるので、本ページでは Clang を使ってC++の学習を進めることにします。Debian 系の OS であれば、次のコマンドで Clang をインストールすることができます。
sudo apt intstall clang
Cコンパイラ (clang) といっしょにC++コンパイラ (clang++) もインストールされます。
$ clang --version
Ubuntu clang version 14.0.0-1ubuntu1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
$ clang++ --version
Ubuntu clang version 14.0.0-1ubuntu1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
コマンドは g++ のかわりに clang++ を使います。なお、Clang は Cygwin でも利用することができます。setup-x86_64.exe で簡単にインストールすることができるので、Cygwin ユーザーで興味のある方は試してみてください。
●たらいまわし関数
それでは、お馴染みの「たらいまわし関数」を使って、g++ と clang++ の実行時間を計測してみましょう。C++の場合、たらいまわし関数は次のようになります。
リスト : たらいまわし関数 (tak.cpp)
#include <iostream>
using namespace std;
int tak(int x, int y, int z)
{
if (x <= y) {
return z;
} else {
return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y));
}
}
int main()
{
cout << tak(24, 12, 0) << endl;
}
時間計測はコマンド time を使います。time で時間を計測する場合、プログラムの起動時間も含まれることに注意してください。実行結果は次のようになりました。
$ clang++ -O2 tak.cpp
$ time ./a.out
1
real 0m8.110s
user 0m8.100s
sys 0m0.010s
$ g++ -O2 tak.cpp
$ time ./a.out
1
real 0m8.102s
user 0m8.102s
sys 0m0.000s
- 実行環境 : Ubunts 22.04 (WSL2, Windows 10), Intel Core i5-6200U 2.30GHz
最適化のオプションはどちらも -O2 を指定しました。clang++ と g++ で実行速度に大きな差はないようです。興味のある方はいろいろ試してみてください。
参考文献, URL
- Bjarne Stroustrup (著), 『プログラミング言語C++ 第 3 版』, アジソンウェスレイ, 1998
- Scott Meyers (著), 吉川邦夫 (訳), 『Effective C++ 改訂 2 版』, 株式会社アスキー, 1998
- Scott Meyers (著), 安村通晃,伊賀聡一郎, 飯田朱美 (訳), 『More Effective C++』, アジソンウェスレイ, 1998
- Margret A. Ellis, Bjarne Stroustrup (著), 足立高徳, 小山裕司 (訳),『注釈C++リファレンスマニュアル』, アジソンウェスレイ・トッパン, 1992
- Patrick Henry Winston (著), 鬼頭繁治 (訳), 『ウィンストンのC++』, アジソンウェスレイ, 1995
- Ravi Sethi (著), 神林靖 (訳), 『プログラミング言語の概念と構造』, アジソンウェスレイ, 1995
- C++ - Wikipedia
- C++11 - Wikipedia
- cpprefjp - C++日本語リファレンス
権利・免責事項など
『お気楽C++プログラミング超入門』の著作権は筆者「広井誠 (Makoto Hiroi)」が保持します。無断使用や無断転載は禁止いたします。『お気楽C++プログラミング超入門』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は出典を明記してくださるようお願いいたします。
ただし、ドキュメントの内容とプログラムは無保証であり、利用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi)」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。
Copyright (C) 2015-2024 Makoto Hiroi
All rights reserved.