ゼロから始めるC++:初心者が知っておきたい基礎と応用

C++とは?その基礎と特徴

C++の概要と歴史

 C++は1983年にビャーネ・ストロヴストルップ氏によって開発された汎用プログラミング言語です。この言語は、C言語を基盤にしつつ、オブジェクト指向プログラミングやジェネリックプログラミングなどの高度な手法を導入しています。C++はその後の改良を重ね、1998年に初めて標準化(C++98)されました。その後、C++11、C++17、C++20といった形で規格が定期的に更新され、最新バージョンが登場しています。この言語は、システムレベルのプログラミングからアプリケーション開発まで幅広い分野で使用され、高い性能と柔軟性を持つ言語として知られています。

C言語との比較:どんな点が異なるのか?

 C++はC言語をベースにしているものの、オブジェクト指向プログラミングや高水準の抽象化をサポートしている点が大きな違いです。具体的には、C++では「クラス」や「オブジェクト」といった構造を通じて、コードの再利用性やメンテナンス性を向上させることができます。また、C++はテンプレートや例外処理といったジェネリックプログラミングのための機能も提供しています。一方で、C言語はシンプルで低水準な操作に向いており、高度な制御が可能なため、システムプログラミングに最適化されています。このため、C++はC言語の柔軟性を引き継ぎつつ、プログラムの設計と管理を容易にするための多くの機能を追加した言語といえます。

C++の主な用途と強み

 C++は、その高いパフォーマンスと柔軟性から、さまざまな分野で利用されています。具体的には、オペレーティングシステム、デバイスドライバ、ゲーム開発、グラフィックス処理、科学技術計算、金融市場向けアプリケーションなどに使用されます。C++の強みとしては、ネイティブコードでコンパイルされるためパフォーマンスが非常に高いこと、またシステムに密接に近いプログラムが可能である点が挙げられます。さらに、最新の標準規格により、より安全かつ効率的なコーディングが可能となっています。このように、C++は初心者からベテランプログラマーまで幅広く支持される言語です。

基本的なプログラム構造

 C++の基本的なプログラム構造はわかりやすい設計になっています。たとえば、以下は典型的なC++プログラムの例です。

  #include <iostream> using namespace std; int main() { cout << "Hello, World!" << endl; return 0; }

 このコードでは、#include <iostream>で標準ライブラリをインクルードし、coutを利用して画面に文字列を出力しています。main関数がプログラムのエントリーポイントです。基本的な構造がシンプルである反面、強力なカスタマイズ機能や拡張性も備えています。

C++でよく使うツールと環境

 C++開発を始めるためには、適切なツールと環境を整えることが重要です。一般的によく使用されるC++のコンパイラとしては、GCC(GNU Compiler Collection)やClang、Microsoft Visual C++、Intel C++ Compilerなどがあります。また、開発環境(IDE)としては、Visual Studio、CLion、Code::Blocks、Dev-C++などが利用されています。これらのツールは豊富なデバッグ機能や補完機能を提供し、開発の効率を向上させます。また、クロスプラットフォーム対応の性質を活かし、Windows、Linux、macOSなどのさまざまな環境でC++プログラムの開発が可能です。

C++プログラミングの基礎を学ぶ

変数と基本データ型

 変数とは、データを格納するための箱のようなもので、C++ではプログラム中のデータの管理に重要な役割を果たします。変数を利用するためには型を指定する必要があり、これをデータ型と呼びます。C++にはいくつかの基本データ型があり、代表的なものとして整数型(int)、浮動小数点型(float, double)、文字型(char)、ブール型(bool)があります。

 例えば、整数を格納するにはint number = 10;のように記述します。また、C++は強い静的型付けの特徴を持つため、変数を宣言する際に型を明示しなければなりません。ただし、autoというキーワードを使用することで、コンパイラに型を推測させることも可能です。

演算子と制御文の使い方

 C++にはさまざまな演算子が用意されており、足し算や引き算などの基本的な算術演算子(+、-、*、/、%)に加え、比較演算子(==、!=、<、>など)や論理演算子(&&、||、!)が一般的に使用されます。これらの演算子を活用することで、より柔軟な処理を実現できます。

 制御文は、プログラムの実行フローを制御するために用いられます。例えば、条件分岐に使用されるif、繰り返し処理を行うforやwhileループがあります。

 以下はif文とfor文の簡単な例です:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
if (x > 0) {
cout << "xは正の値です。" << endl;
}
for (int i = 0; i < 5; i++) {
cout << "現在のiの値: " << i << endl;
}
if (x > 0) { cout << "xは正の値です。" << endl; } for (int i = 0; i < 5; i++) { cout << "現在のiの値: " << i << endl; }
if (x > 0) {
    cout << "xは正の値です。" << endl;
}

for (int i = 0; i < 5; i++) {
    cout << "現在のiの値: " << i << endl;
}

関数とスコープ

 関数は特定の処理をまとめるために使用されるもので、プログラムの再利用性や可読性を高めます。C++では、関数を定義する際に戻り値の型、関数名、引数リストを指定します。例えば、以下のような簡単な関数を作成できます:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
int add(int a, int b) {
return a + b;
}
int add(int a, int b) { return a + b; }
int add(int a, int b) {
    return a + b;
}

 関数のスコープとは、変数や関数がアクセス可能な範囲を指します。スコープには、ローカルスコープとグローバルスコープがあります。ローカルスコープは関数内で定義された変数に適用され、グローバルスコープはプログラム全体でアクセスできる変数に適用されます。

入出力操作: cinとcout

 C++のプログラムにおける基本的な入出力操作には、cinとcoutが使用されます。coutを使用するとコンソール画面にデータを出力することができ、cinを使用するとユーザーからの入力を受け取ることができます。以下はその例です:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <iostream>
using namespace std;
int main() {
int age;
cout << "年齢を入力してください: ";
cin >> age;
cout << "あなたの年齢は " << age << " 歳です。" << endl;
return 0;
}
#include <iostream> using namespace std; int main() { int age; cout << "年齢を入力してください: "; cin >> age; cout << "あなたの年齢は " << age << " 歳です。" << endl; return 0; }
#include <iostream>
using namespace std;

int main() {
    int age;
    cout << "年齢を入力してください: ";
    cin >> age;
    cout << "あなたの年齢は " << age << " 歳です。" << endl;
    return 0;
}

 上記例では、cinでユーザーから入力を受け取り、それをcoutで表示しています。このようにしてデータを動的に扱うことが可能です。

メモリ管理とポインタの概念

 C++の特徴の一つとして、メモリ管理をプログラマーが詳細に制御できる点が挙げられます。これにはポインタが密接に関わっています。ポインタとは、他の変数のメモリアドレスを格納する特殊な変数のことです。以下はポインタの基本的な使用例です:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
int x = 10;
int* ptr = &x; // xのアドレスを取得してptrに格納
cout << "xの値: " << x << endl;
cout << "ptrが指す値: " << *ptr << endl; // ポインタ経由でxの値を取得
int x = 10; int* ptr = &x; // xのアドレスを取得してptrに格納 cout << "xの値: " << x << endl; cout << "ptrが指す値: " << *ptr << endl; // ポインタ経由でxの値を取得
int x = 10;
int* ptr = &x; // xのアドレスを取得してptrに格納
cout << "xの値: " << x << endl;
cout << "ptrが指す値: " << *ptr << endl; // ポインタ経由でxの値を取得

 C++では、newキーワードで動的にメモリを割り当て、deleteキーワードでそのメモリを解放する必要があります。ただし、モダンC++(C++11以降)ではsmart pointersの導入により、手動でのメモリ管理の必要性が大幅に減少しています。

オブジェクト指向プログラミングとC++

クラスとオブジェクトの基本

 クラスとオブジェクトは、C++のオブジェクト指向プログラミングの基盤となる重要な概念です。クラスはデータ構造や操作(メソッド)を定義する設計図のような役割を果たします。一方、オブジェクトはそのクラスをもとに生成された実際のインスタンスで、クラスで定義されたプロパティやメソッドを持っています。

 例えば、「車」というクラスを作成すると、それをもとに「自動車A」や「自動車B」といった具体的なオブジェクトを生成することができます。このようなモデリングを行うことで、コードの再利用性と構造の明確化が実現できます。C++を使用すると、これらのクラスやオブジェクトを効率的に扱うことが可能です。

コンストラクタとデストラクタ

 コンストラクタとデストラクタは、クラスの初期化と解放を行う特別なメソッドです。コンストラクタはオブジェクトが生成される際に自動的に呼び出され、初期化処理を行います。たとえば、クラス内のメンバ変数の設定や必要なリソースの確保などが含まれます。一方、デストラクタはオブジェクトが破棄される際に自動的に呼び出され、リソースの解放や終了処理を行います。

 これにより、C++では手動でメモリ管理を行う必要がある場面でも、効率的かつ安全にリソースを管理することが可能です。特に動的メモリを扱う場合、これらの仕組みを活用することで、メモリリークを防ぐことができます。

継承と多態性(ポリモーフィズム)

 継承は既存のクラスの機能を引き継ぎつつ、新しい機能を追加できる仕組みです。C++では、子クラスは親クラスからプロパティやメソッドを受け継ぐことができるため、コードの再利用性と拡張性が向上します。一例として、「動物」という親クラスを作成し、その動物クラスを継承した「犬」や「猫」という子クラスを作ることが挙げられます。

 多態性(ポリモーフィズム)は、同じインターフェースを使用して、異なる動作をするメソッドを実現する仕組みです。これにより、動的バインディングを使用して、派生クラスで定義されたメソッドが実行されるようになります。C++では、仮想関数(virtual関数)を利用することでポリモーフィズムを実装できます。

テンプレートとSTL(標準テンプレートライブラリ)の活用

 C++にはジェネリックプログラミングをサポートするテンプレート機能があります。テンプレートを使用すると、型に依存しない汎用的なクラスや関数を作成でき、異なるデータ型にも対応できる柔軟なプログラム開発が可能です。例えば、整数や文字列といった異なる型を扱う配列クラスをテンプレートで効率的に構築できます。

 また、標準テンプレートライブラリ(STL)は、C++の強力なツールセットの1つで、効率的なデータ構造(例えば、ベクターやリスト)やアルゴリズム(ソートや検索など)が含まれています。テンプレートとSTLを活用することで、開発の効率を大幅に向上させることができます。

実践的なC++プログラミング

例外処理とエラーハンドリング

 C++では、プログラムの実行中に発生するエラーを適切に処理するための仕組みとして例外処理が用意されています。try、catch、throwを使うことで、発生したエラーを捕捉し、対処を簡潔に記述できます。これにより、異常時の挙動を明確にし、プログラムが途中で異常終了することを防ぐことが可能です。

 例えば、ファイルが存在しない場合や、メモリ不足が発生した場合など、意図しない状況への対応を容易にします。また、C++の標準ライブラリには多くの例外クラスが用意されており、適切なエラーハンドリングが求められる場面において活用されます。

モダンC++の新機能(C++11以降)

 C++11以降、言語仕様に多くの改良が加えられ、より簡潔で効率的なプログラムが記述できるようになりました。新しい機能として、ラムダ式、スマートポインタ(std::shared_ptrやstd::unique_ptr)、constexpr、auto型推論、範囲ベースforループなどがあります。

 特にスマートポインタは、プログラマが手動でメモリを管理する手間を減らし、メモリリークのリスクを軽減します。また、C++17ではstd::optionalや構造化束縛、C++20ではコルーチンやコンセプト(Concepts)などが追加され、より直感的かつ表現力豊かな記述が可能になっています。

 これらのモダンC++の機能を活用することで、保守性やパフォーマンスが向上した高品質なコードを記述することができます。

デバッグと最適化の基礎

 C++は高性能なプログラムを記述できる一方で、バグの発見や解消が他の言語に比べて難しい場合があります。そのため、デバッグの基本的な手法を身に着けることが重要です。主な方法として、デバッガを活用してブレークポイントを設定したり、変数の状態を監視したりすることが挙げられます。主に使用されるツールとして、GDBやVisual Studioのデバッグ機能などがあります。

 デバッグだけでなく、最適化も重要なポイントです。コードの性能を向上させるためには、計算量や必要なメモリの削減を意識した設計が求められます。C++はコンパイル時の最適化が強力であり、その特性を活かして無駄のないネイティブコードを生成することが可能です。また、プロファイリングツールを使えばボトルネックの特定や性能改善のヒントを得ることができます。

プロジェクト設計とコードの再利用性

 C++で大規模なプロジェクトを設計する際には、オブジェクト指向プログラミング(OOP)の概念が強力なツールとなります。クラスや継承を活用することで、機能の拡張やメンテナンスが容易になり、コードの再利用性を高めることが可能です。また、ジェネリックプログラミングを用いてテンプレートを活用することで、汎用性の高いコードを実現できます。

 さらに、モジュール化を通じてコードを分割し、他のプロジェクトでも再利用できるライブラリとして活用することも可能です。例えば、C++の標準テンプレートライブラリ(STL)は再利用性の高い優れた例であり、開発者が効率よく開発を進めるための良い参考となります。

 効率的なプロジェクト設計は、ソフトウェアの保守性を向上させ、複雑なシステムをシンプルに管理する鍵となります。設計段階で再利用性に配慮することで、完成後のコスト削減にも繋がります。

Unreal Engine入門:ゼロから始めるゲームクリエイターの道

Unreal Engineとは?

Unreal Engineの基本概要

 Unreal Engineは、Epic Gamesによって開発された強力なゲームエンジンで、その誕生は1998年にまでさかのぼります。このエンジンは、ゲーム開発者に対してリアルなグラフィックス、精密な物理演算、そして高度なプログラミングインターフェースを提供し、特に高品質な3Dゲームの制作において広く採用されています。Unreal Engineの魅力は、その使いやすさと柔軟性で、ゲーム開発の初心者からプロフェッショナルまで幅広いユーザーに支持されています。

ゲーム開発におけるUnreal Engineの位置づけ

 ゲーム開発の世界において、Unreal Engineは他のエンジンと比べても非常に重要な位置を占めています。特にUnreal Engineのブループリントによるビジュアルスクリプティング機能は、コーディング経験の乏しい人でもゲームロジックを視覚的に構築できるため、非常に人気があります。また、Unreal Engineはハイエンドのゲームタイトルにも多く採用されており、ドラゴンクエストXIやFINAL FANTASY VII REMAKEなどの有名な作品もUnreal Engineをベースに開発されています。さらに、チュートリアルや入門書が多く存在し、C++を用いた高度なプログラミングも可能なことから、新たなゲームクリエイターがキャリアを始める際の強力なツールとなっています。

Unreal Engineの歴史と進化

初期のバージョンとその特徴

 Unreal Engineは、1998年にEpic Gamesによって初めてリリースされました。その初期バージョンは、特にその高度なグラフィック表現能力と、当時としては異例の高い自由度が特徴でした。Unreal Engineを用いることで、開発者はリアルタイムで3D環境を設計し、動的に光や影を表現することが可能になったため、ゲーム業界に革新をもたらしました。このバージョンは主にC++を用いて開発され、プログラマーにとって柔軟性の高いエンジンとなっていました。その結果、Unreal Engineはさまざまな大作ゲームの中核技術として使われるようになりました。

最新バージョンUnreal Engine 5の特徴

 最新のUnreal Engine 5は、以前のバージョンからの大幅な進化を遂げています。NaniteとLumenといった新しい技術により、よりリアルで細部にこだわった視覚体験を提供します。Naniteは仮想ジオメトリ技術で、複雑なモデルをリアルタイムで描画し、またLumenはダイナミックなグローバルイルミネーションシステムを提供します。これにより、開発者はより没入感のある環境を作成できます。また、ブループリントによるビジュアルスクリプティングが強化され、プログラミングの知識が少ない人でも複雑なゲーム動作を実装しやすくなっています。こうした特徴により、Unreal Engine 5は初心者からプロまで、さまざまなゲームクリエイターにとって非常に使いやすいプラットフォームとなっています。

Unreal Engineのインストールと初期設定

必要なシステム要件と事前準備

 Unreal Engineを使用するためには、まず自身のシステムが要求される条件を満たしているか確認する必要があります。Unreal Engine 5は非常に高度なグラフィック処理能力を必要とするため、一般的には以下のようなシステム要件が推奨されています。CPUはマルチコアの高性能プロセッサが推奨されており、GPUもDirectX 12互換の強力なものが必要です。RAMは最低16GBが必要で、32GB以上あればより快適に開発が行えます。SSDストレージも推奨されており、十分な空き容量を確保しましょう。また、事前準備として、Epic Gamesのアカウントを作成し、Epic Games Launcherをインストールしておくことが重要です。

インストールステップガイド

 Unreal Engineのインストールプロセスは比較的簡単に進められます。まず、Epic Games Launcherを起動し、Epic Gamesアカウントでログインします。その後、ランチャー内で「Unreal Engine」のタブを選択すると、インストールオプションにたどり着くことができます。ここで、インストールするUnreal Engineのバージョンを選択します。通常は最新の安定版を選ぶのが良いでしょう。インストールボタンをクリックすると、必要なファイルのダウンロードとインストールが自動で行われます。時間がかかることもあるため、ネットワークの安定化と十分なディスクスペースを確保しておくと良いです。

プロジェクト作成と基本設定

 Unreal Engineのインストールが完了したら、次に行うのは新しいプロジェクトの作成です。Epic Games Launcher内の「Unreal Engine」タブから「新しいプロジェクト」ボタンをクリックし、プロジェクトのテンプレートを選択します。テンプレートでは「空のプロジェクト」から「アクションゲーム」などのプリセットが用意されているため、目的に合ったものを選びましょう。その後、プロジェクト名や保存場所を決定し、「作成」ボタンをクリックします。プロジェクトが作成されると、Unreal Engine Editorが起動し、各種設定画面が表示されます。まずははじめに簡単な環境設定を行い、視覚的に分かりやすいものに調整しておくと、作業効率が上がります。

Unreal Engineの基本操作

エディタの概要と使い方

 Unreal Engineのエディタは、ゲーム開発の中心となるツールです。直感的なUIを持ち、初心者でも簡単に操作できるよう設計されています。このエディタを通じて、プロジェクトの作成や編集、さまざまな設定を行うことができます。まず、エディタを開くと大きく分けて四つの領域が目に入ります。それは、ビューポート、コンテンツブラウザ、アウトライナー、そして詳細パネルです。

 ビューポートは3D環境を表示し、オブジェクトを直接操作することができます。コンテンツブラウザでは、使用するアセットやブループリントを管理し、簡単にプロジェクトに追加できます。アウトライナーは、現在のシーンに存在するオブジェクトのリストを表示し、どのオブジェクトがどのように配置されているかを簡単に把握できます。最後に、詳細パネルでは選択したオブジェクトの属性を変更でき、多様な設定を行うことが可能です。Unrial Engine入門者にとって、これらの基本を理解することは非常に重要です。

ブループリントを使ったプログラミング

 Unreal Engineのブループリントシステムは、プログラミングの経験が浅い方でもゲームロジックを直感的に作成できる強力なツールです。ビジュアルスクリプトの形をとっており、ノードベースで簡単にゲームの動作を制御できます。特にUnrialEngineの入門段階では、ブループリントを活用することで複雑なコードを書かずに、さまざまな機能をゲームで実現することができます。

 ブループリント上でノードを配置し、それぞれに異なる関数やイベントを割り当てることで、プレイヤーの動きやゲームイベントを制御することが可能です。また、C++による詳細な制御が必要な場合でも、ブループリントはその補完として有効に機能します。ブループリントはゲーム開発を加速させる便利なツールとして、多くのゲームクリエイターに利用されています。Unreal Engineとブループリントを使ったプログラミングは、これからゲーム開発を学びたい方には最適な出発点となります。

簡単なゲームの制作ワークフロー

プロジェクトの企画と設計

 Unreal Engineを用いてゲームを制作する際、まずはプロジェクトの企画と設計をしっかりと行うことが重要です。企画段階では、どのようなゲームを作りたいか、そのゲームの目的やターゲットユーザーを明確にしましょう。次に、ゲームのコンセプトやストーリー、ゲームプレイの魅力などを具体的に決めていきます。この段階で決定した要素が、プロジェクト全体の方向性を左右するため、チームメンバーとの共有と合意を大切にします。

オブジェクトの配置と環境設定

 ゲームの企画と設計が完了したら、Unreal Engine上でオブジェクトの配置と環境設定を行います。まず、エディタを使って必要なアセットをインポートし、ゲームシーンに配置します。このとき、ブループリントを活用すると、視覚的に簡単にオブジェクトを制御することができます。さらに、ライティングやマテリアルの設定を行い、視覚的に魅力的なゲーム環境を構築します。Unreal Engineのエディタは、3D空間での操作が直感的に行えるため、初めての方でも馴染みやすいのが特徴です。

テストとデバッグの方法

 オブジェクトの配置と環境設定が整ったら、次に行うのがテストとデバッグです。まず、ゲームを何度もプレイし、意図したとおりに動作するかを確認します。不具合が見つかった場合は、ブループリントやC++コードを見直し、取り除いていきます。Unreal Engineでは、リプレイ機能やデバッグツールを使用することで、効率的に問題を特定し、修正することが可能です。このプロセスを繰り返し行うことで、ゲームの品質を高め、最終的なリリースに向けて準備を整えます。

ゲームクリエイターとしてのキャリアを始める

Unreal Engineを使ったプロジェクトのポートフォリオ作成

 ゲームクリエイターとしてのキャリアを築くためには、Unreal Engineを使ったプロジェクトのポートフォリオ作成が非常に重要です。ポートフォリオは自分のスキルを具体的に示す手段として機能し、採用担当者に自分の能力を効果的に伝えることができます。Unreal Engine 5は、豊富な機能と高いグラフィック表現力で注目されています。このエンジンを使ったプロジェクトなら、斬新なアイディアのゲームでもビジュアル面での印象を強めることが可能です。

 ポートフォリオに載せるプロジェクトは、自分が興味を持って取り組んだものを選びましょう。例えば、アクションゲームの企画から設計、開発に至るまでを一貫して行い、その過程で習得したUnreal Engineのスキルやブループリントを用いたプログラミング技術を示すことができます。また、作品に解説を加え、どの部分に力を注いだのかや、どのようにして課題を解決したのかを具体的に説明することも大切です。

学習リソースと次のステップ

 Unreal Engine 5を学ぶための良質なリソースを手に入れることは、ゲームクリエイターとしてのキャリアを始める第一歩です。「ハンズオンで身につく! Unreal Engine 5 ゲーム開発入門」などの初心者向け書籍は、無理なくステップバイステップで学べるため、初学者にとって有用です。この書籍では、基礎的なシステムの構築から始めて徐々に複雑なゲーム制作の流れを学べます。

 さらに、オンラインチュートリアルやコミュニティフォーラムも活用してください。特に、ブループリントを使用したプログラミングのチュートリアルや、Unreal Engineの公式ドキュメンテーションは非常に役立つことでしょう。これらのリソースを通じて、基本的な使い方から高度な技術まで、幅広い知識を積み重ねることができます。

 次のステップとして、自分の興味を持つジャンルのゲームクリエイティブにチャレンジし、独自のプロジェクトに応用していくことが求められます。実際のプロジェクトを進めながら、日々の学びを実践に取り入れることで、ゲームクリエイターとしてのスキルを一層向上させましょう。

C++ search

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> v{ 2,3,5,1,4 };
    auto begin = v.cbegin();
    auto end = v.cend();

    int target = 3;
    auto pos = find(begin, end, target);
    if (pos == end)
        cout << "見つからない\n";
    else
        cout << "見つかった: " << *pos << endl; // 出力値: 見つかった: 3

    target = 6; // Correcting typo from 'traget' to 'target'
    pos = find(begin, end, target);
    if (pos == end)
        cout << "見つからない\n"; // 出力値: 見つからない
    else
        cout << "見つかった: " << *pos << endl;

    return 0;
}

C++ 反復子

#include <iostream>
#include <vector>
#include <list>
#include <numeric>

template <typename T>
int total(T first, T last) {
    int sum = 0;
    for (T p = first; p != last; ++p) sum += *p;
    return sum;
}

int main() {
    std::vector<int> v{ 1, 2, 3, 4, 5 };
    std::cout << total(v.begin(), v.end()) << std::endl;
    std::cout << std::accumulate(v.begin(), v.end(), 0) << std::endl;

    int a[] = { 1, 2, 3, 4, 5 };
    std::cout << total(std::begin(a), std::end(a)) << std::endl;
    std::cout << std::accumulate(std::begin(a), std::end(a), 0) << std::endl;

    std::list<int> li{ 1, 2, 3, 4, 5 };
    std::cout << total(li.begin(), li.end()) << std::endl;
    std::cout << std::accumulate(li.begin(), li.end(), 0) << std::endl;

    return 0;
}