Qtの基礎 - コンテナクラス
		
		
		
		ナビゲーションに移動
		検索に移動
		
概要
QVector
CMake / QMake
QVectorクラスを使用する場合は、QVectorをインクルードする必要がある。
 #include <QVector>
- CMakeを使用する場合
 # Qt 5の場合
 find_package(Qt5 REQUIRED COMPONENTS Core)
 target_link_libraries(<ターゲット名> PRIVATE Qt5::Core)
 
 # Qt 6の場合
 find_package(Qt6 REQUIRED COMPONENTS Core)
 target_link_libraries(<ターゲット名> PRIVATE Qt6::Core)
- QMakeを使用する場合
 QT += core
QVectorクラスとは
QVectorクラスはstd::vectorクラスと似ているが、いくつかの違いがある。
- 互換性
- std::vectorクラス
- C++標準ライブラリの一部であり、どのC++環境でも利用可能である。
 
- QVectorクラス
- Qtフレームワークの一部であり、Qtを使用するプロジェクトでのみ利用可能である。
 
 
- std::vectorクラス
- パフォーマンス
- 一般的に、両者のパフォーマンスは非常に近い。
- QVectorクラスは特定のケースでQtのその他の機能とより効率的に連携する可能性がある。
 
- 機能
- 基本的な機能は両者でほぼ同じである。
- QVectorクラスは、Qtの他のコンテナやアルゴリズムとシームレスに動作する。
- std::vectorクラスは、C++標準ライブラリのアルゴリズムと完全に互換性がある。
 
- シリアライゼーション
- QVectorクラスは、Qtのシリアライゼーション機能と直接連携できる。
- std::vectorクラスの場合、カスタムシリアライゼーションが必要になる場合がある。
 
- イテレータの無効化
- QVectorクラスは、要素の追加や削除時にイテレータを無効化しない設計になっている (特定の条件下)
- std::vectorクラスは、要素の追加や削除でイテレータが無効化される可能性がある。
 
- メモリ管理
- QVectorクラスは、暗黙的な共有 (implicit sharing) を使用しており、コピーオンライト (copy-on-write) の最適化が行われる。
- std::vectorクラスは、一般的に、明示的なメモリ管理を行う。
 
選択の指針を以下に示す。
- Qtを広範囲に使用するプロジェクトでは、QVectorクラスを選択すると他のQt機能との連携がスムーズになる。
- クロスプラットフォームの可搬性やC++標準との互換性を重視する場合は、std::vectorクラスが適している。
- 特にQtに依存しない部分のコードでは、std::vectorクラスを使用することにより、将来的にQtから他のフレームワークに移行する際の労力を減らせる可能性がある。
- パフォーマンスの観点からは、どちらも十分に最適化されているため、大きな違いはない。
結論として、Qtを主要なフレームワークとして使用しているプロジェクトでは、QVectorクラスを使用することにより、Qtの他の機能との統合が容易になる。
一方、より汎用的なC++コードを記述する場合や、将来的な移植性を考慮する場合は、std::vectorクラスを選択するほうがよい。
例えば、ユーザグループを取得するロジックの場合、処理の大部分がC系の関数に依存しているため、std::vectorクラスを使用しても問題ない。
ただし、Qtを広範囲に使用するプロジェクトであれば、一貫性を保つためにQVectorクラスを選択することも合理的である。