Qt コンテナ クラス: 汎用アルゴリズム

<QtAlgorithm> ヘッダー ファイルでは、Qt はいくつかのグローバル テンプレート関数を提供します。これらは、コンテナーで使用できる非常に一般的に使用されるアルゴリズムです。これらのアルゴリズムは、QList、QLinkedList、QVector、QMap、QHash などの STL スタイルのイテレータを提供する任意のコンテナ クラスで使用できます。STL がターゲット プラットフォームで使用できる場合は、Qt のこれらのアルゴリズムの代わりに STL のアルゴリズムを使用できます。これは、Qt が提供するアルゴリズムは最も重要なアルゴリズムの一部のみであるのに対し、STL はより多くのアルゴリズムを提供するためです。

歴史的に、Qt は多くの STL アルゴリズム関数と直接同等の関数を提供してきました。Qt 5.0 以降、Qt は STL で利用可能な実装を直接使用することを推奨していますが、それらのほとんどは Qt によって非推奨になりました (ただし、警告付きで古いコードのコンパイルを維持するために使用することはできます)。

ほとんどの場合、非推奨の Qt アルゴリズム関数を使用するアプリケーションは、同等の STL 関数を使用するように簡単に移植できます。
次の表に示すように、 #include <algorithm> ヘッダー ファイルを追加し、Qt 関数を STL に対応する関数に置き換える必要があります。

Qt関数

STL関数

qBinaryFind

std::binary_search | std:: lower_bound

qコピー

std::コピー

qコピーバックワード

std::copy_backward

q等しい

std::等しい

qFill

std::fill

q検索

std::find

qカウント

std::カウント

qソート

std::ソート

qStableSort

std::stable_sort

q下限

std:: lower_bound

q上限

std::upper_bound

q少ない

std::レス

qグレーター

std::大きい

以下は、一般的に使用されるいくつかのアルゴリズムのデモンストレーションです。他のアルゴリズムについては、ヘルプ索引の「汎用アルゴリズム」キーワードを確認してください。

(1) 並べ替え

並べ替えアルゴリズムの例は次のとおりです。

//使用快速排序算法对list进行升序排序,排序后两个12的位置不确定
QList<int> list1;
list1 << 33 << 12 << 68 << 6 << 12;
std::sort(list1.begin(), list1.end());
qDebug() << list1; // 输出:(6, 12, 12, 33, 68)

//使用一种稳定排序算法对list2进行升序排序,排序前在前面的12,排序后依然在前面
QList<int> list2;
list2 << 33 << 12 << 68 << 6 << 12;
std::stable_sort(list2.begin(), list2.end());
qDebug() << list2; // 输出:(6, 12, 12, 33, 68)

//使用qSort()函数和std::greater算法中使list3反向排序
QList<int> list3;
list3 << 33 << 12 << 68 << 6 << 12;
qSort(list3.begin(), list3.end(), std::greater<int>()); //Qt5已弃用
qDebug() << list3; // 输出:(68, 33, 12, 12, 6)

デフォルトでは、qSort() は < 演算子を使用して、つまり昇順で要素を比較します。降順に変更する必要がある場合は、qGreater<T>() を 3 番目のパラメーターとして qSort() 関数に渡す必要があります。

(2) 探す

ルックアップ アルゴリズムの例は次のとおりです。

//使用std::find()从list中查找"two",返回第一个对应的值的迭代器,如果没有找到则返回end()
QStringList list1;
list1 << "one" << "two" << "three";
QList<QString>::iterator i = std::find(list1.begin(), list1.end(), "two");
qDebug() << *i; //输出:"two"

//使用qFind()从list中查找"two",返回第一个对应的值的迭代器,如果没有找到则返回end()
QStringList list2;
list2 << "one" << "two" << "three";
QStringList::iterator j = qFind(list2.begin(), list2.end(), "two");
qDebug() << *j; //输出:"two"

qFind() と同様に動作する qBinaryFind() 関数もあります。違いは、qBinaryFind() はソートされたコレクションの検索にのみ適した二分探索アルゴリズムであるのに対し、qFind() は標準の線形探索であることです。一般に、二分探索法はより要求が厳しくなりますが、より効率的です。

(3) コピー

レプリケーション アルゴリズムの例は次のとおりです。

//将list1中所有项目复制到vect1中
QStringList list1;
list1 << "one" << "two" << "three";
QVector<QString> vect1(list1.count());
std::copy(list1.begin(), list1.end(), vect1.begin());
qDebug() << vect1; //输出:QVector("one", "two", "three")

//将list2中所有项目复制到vect2中
QStringList list2;
list2 << "one" << "two" << "three";
QVector<QString> vect2(list2.count());
qCopy(list2.begin(), list2.end(), vect2.begin());
qDebug() << vect2; //输出:QVector("one", "two", "three")

記事はブログガーデン(fengMisaka)から転載しました:Qtコンテナクラス3:一般アルゴリズム - fengMisaka - blog garden

この記事のメリット、Qt 開発学習教材パッケージの受け取り料金、技術ビデオ、コンテンツには (C++ 言語基礎、Qt プログラミング入門、QT シグナルとスロットのメカニズム、QT インターフェイス開発イメージ図、QT ネットワーク、QT データベース プログラミング、QT プロジェクト戦闘、QSS、OpenCV、Quick モジュール、インタビューの質問など) ↓↓↓↓↓↓ 下記を参照

おすすめ

転載: blog.csdn.net/QtCompany/article/details/131816614