【比較資料】Python・C++・C# におけるリスト(配列)への異なる型の格納
この資料では、整数と文字列など「異なる型」を1つのリスト(配列)に格納する方法を、Python・C++・C# の3言語で比較します。
目次
1. Python
サンプルコード
# list_example.py
l = [1, "2"]
print(l) # [1, '2'] と表示される
解説
- Pythonは動的型付け言語なので、変数やリストに格納するオブジェクトの型を明示的に制限しません。
- リストは角括弧
[]
で簡単に定義でき、[1, "2"]
のように整数と文字列を混在して格納できます。 print(l)
でリストを出力すると、Pythonのリスト表記([1, '2']
)のまま表示されます。
2. C++
サンプルコード
// list_example.cpp
#include <iostream>
#include <vector>
#include <variant>
#include <string>
int main() {
// 異なる型を1つのコンテナに格納するためにstd::variantを使用
std::vector<std::variant<int, std::string>> v;
v.push_back(1); // int型を追加
v.push_back("2"); // const char* -> std::string への変換後にvariantに格納
// 取り出しと表示
for (auto &elem : v) {
if (std::holds_alternative<int>(elem)) {
std::cout << std::get<int>(elem) << " ";
} else if (std::holds_alternative<std::string>(elem)) {
std::cout << std::get<std::string>(elem) << " ";
}
}
std::cout << std::endl;
return 0;
}
解説
- C++は静的型付け言語であり、
vector<int>
のように型を固定して宣言します。 - 異なる型を混在して扱うためには、C++17以降で使用できる
std::variant
や、C++17以前であればboost::variant
などを用いる必要があります。 std::variant<int, std::string>
のように「どの型を格納できるか」を列挙しておき、実行時にはstd::holds_alternative<T>()
とstd::get<T>()
で型を判別・取得します。
3. C#
サンプルコード
// list_example.cs
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// C#も静的型付け言語だが、object型を使うことで異なる型を格納可能
List<object> list = new List<object>();
list.Add(1); // int型を追加
list.Add("2"); // string型を追加
// 出力
foreach (var item in list)
{
Console.WriteLine(item);
}
}
}
解説
- C#も静的型付け言語ですが、すべてのクラスや値型の基底にあたる
object
型を使用することで、異なる型を同じリストに格納できます。 List<object>
に対してlist.Add(1)
とlist.Add("2")
のように、整数・文字列などを混在して追加可能です。- 実行すると、各要素が順に
1
と2
として表示されます(Console.WriteLine
はToString()
を呼び出します)。
4. 言語間の比較まとめ
項目 | Python | C++ | C# |
---|---|---|---|
型システム | 動的型付け | 静的型付け | 静的型付け |
異なる型の リスト格納 | 可能(制限なし) | std::variant やstd::any などを使う必要あり | object 型のリストを使用 |
リストの宣言 | l = [1, "2"] | std::vector<std::variant<int, std::string>> v; など | List<object> list = new List<object>(); |
要素の追加 | l.append(x) | v.push_back(x) | list.Add(x) |
出力方法 | print(l) | std::cout << ... | Console.WriteLine(...) |
実行方法 | インタプリタ実行 ( python xx.py ) | コンパイル後に実行 ( g++ xx.cpp -o xx → ./xx ) | コンパイル後に実行 ( csc xx.cs → xx.exe ) |
5. まとめ
- Python
- 動的型付け言語であるため、リストに異なる型の要素を自由に混在させることができます。宣言や型チェックの手間が少なく、短いコードで実現できるのが特徴です。
- C++
- 静的型付け言語であり、高速性と型安全性を重視しています。異なる型を1つのコンテナに格納する場合は、
std::variant
などを使用して格納可能な型を列挙し、取り出し時に型判定が必要です。
- 静的型付け言語であり、高速性と型安全性を重視しています。異なる型を1つのコンテナに格納する場合は、
- C#
- 静的型付け言語ですが、
object
型を利用することで、あらゆる型を1つのコレクションに格納できます。 - ただし、
object
による格納はボックス化やキャストなどのオーバーヘッドが発生する可能性があり、型安全性も下がる点に注意が必要です。 - 必要に応じてジェネリックや
dynamic
を活用する選択肢もあります。
- 静的型付け言語ですが、
以上が、Python・C++・C# における「異なる型を同一のリスト(配列)に格納する」方法の比較となります。各言語の特性に応じて、適切な手法を選択してください。
ディスカッション
コメント一覧
まだ、コメントがありません