QT汎用アルゴリズム
3523 ワード
一、QT汎用アルゴリズム
コンテナ:vector、list、queue、stack
qFill()は、指定された値を使用してコンテナを充填します.例:
デフォルトでは、qSort()は<演算子を使用して要素の比較を行います.これは、必要に応じて<演算子を定義する必要があることを示しています.減算順にソートする必要がある場合は、
なお,ここのTは実際には容器の汎用型である.実際には、3番目のパラメータを使用してソートを定義できます.たとえば、カスタムデータ型には、比較関数よりも小さい大文字と小文字が敏感なQStringがあります.
では、qSort()を使用して、この関数を使用することができます.
は、コンテナ上の基本アルゴリズムを実装するための一連のQT汎用テンプレート関数を提供する.このアルゴリズムの多くはSTLスタイルの遍歴器(前述のJavaスタイルの遍歴器とSTLスタイルの遍歴器を覚えていますか?)に依存しています.実際には,C++STLもヘッダファイルに含まれる多くの汎用アルゴリズムを提供している.このアルゴリズムはQt容器にも同様に適用できる.したがって、Qtのヘッダファイルに使用したいアルゴリズムが含まれていない場合は、STLのアルゴリズムを使用して置き換えることができ、競合は発生しません.ここでは,いくつかのQtにおける汎用アルゴリズムについて述べる.これらのアルゴリズムはすべて簡単ですが、ライブラリ関数は自分で書くよりも効率的であることが多いので、システムが提供する関数の使用をお勧めします.コンテナ:vector、list、queue、stack
1.qFind() :
qFind()関数は、コンテナ内で特定の値を検索します.そのパラメータには開始位置と終了位置があり、検索された要素が存在する場合、関数は最初の一致項目の位置を返し、そうでない場合は終了位置を返します.ここで言う「位置」は、実はSTLスタイルの遍歴器です.STLスタイルの遍歴器を用いると,一つの位置を反映できることを知っている.例えば以下の例では、iの値はlistとなる.begin()+1,jはlist.end(): QStringList list;
list << "Emma" << "Karl" << "James" << "Mariette";
QStringList::iterator i = qFind(list.begin(), list.end(), "Karl");
QStringList::iterator j = qFind(list.begin(), list.end(), "Petra");
2.qBinaryFind()
の挙動はqFind()に似ているが,qBinaryFind()は二分ルックアップアルゴリズムであり,ルックアップソート後の集合にのみ適用され,qFind()は標準的な線形ルックアップである.通常、二分ルックアップ法は使用条件が厳しいが、効率も高い.qFill()は、指定された値を使用してコンテナを充填します.例:
QLinkedList list(10);
qFill(list.begin(), list.end(), 1009);
3.qFill()
は、他の遍歴器ベースのアルゴリズムと同様に、容器の一部についても動作することができる.例えば、次のコードはvectorの上位5ビットを1009に設定し、最後の5ビットを2013に設定する.QVector vect(10);
qFill(vect.begin(), vect.begin() + 5, 1009);
qFill(vect.end() - 5, vect.end(), 2013);
4.qCopy()
アルゴリズムは、1つのコンテナ内の要素を別のコンテナにコピーすることを実装することができ、例えば、QVector vect(list.count());
qCopy(list.begin(), list.end(), vect.begin());
qCopy()
は、同じ容器内の要素の複製にも使用することができる.qCopy()操作の成功の鍵は,ソースコンテナと宛先コンテナの範囲がオーバーフローしないことである.たとえば、リストの最後の2つの要素を前の2つの要素にコピーします.qCopy(list.begin(), list.begin() + 2, list.end() - 2);
5.qSort()
は容器要素の増分ソートを実現し、使用も簡単です.qSort(list.begin(), list.end());
デフォルトでは、qSort()は<演算子を使用して要素の比較を行います.これは、必要に応じて<演算子を定義する必要があることを示しています.減算順にソートする必要がある場合は、
qGreater()
を3番目のパラメータとしてqSort()関数に渡す必要があります.例:qSort(list.begin(), list.end(), qGreater());
なお,ここのTは実際には容器の汎用型である.実際には、3番目のパラメータを使用してソートを定義できます.たとえば、カスタムデータ型には、比較関数よりも小さい大文字と小文字が敏感なQStringがあります.
bool insensitiveLessThan(const QString &str1, const QString &str2)
{
return str1.toLower() < str2.toLower();
}
では、qSort()を使用して、この関数を使用することができます.
QStringList list;
// ...
qSort(list.begin(), list.end(), insensitiveLessThan);
qStableSort()
関数は、安定した順序付けである点が異なるqSort()と同様である.安定ソートはアルゴリズム設計上の名詞であり、ソート中に2つの要素が等しい場合、ソート結果における2つの要素の前後順序はソート前の元の順序と一致することを意味する.例を挙げると、a 1,a 5,a 32,a 31,a 4のシーケンスについて、それらのサイズ順はa 16.qDeleteAll()相关数,将delete操作在contena中被格纳的所有积分.该相关数只适用于环节要素在积分的情况下。实行该相关数的话,康特纳内的积分是delete演算,但这些积分依然被康特纳格纳,成为野积分.为了避免这些积分的误用,需要呼吁康特纳的clear()相关数。qDeleteAll(list);
list.clear();
7.qSwap()相关数可以交换两个要素的位置.例:int x 1=line.x1();
int x2 = line.x2();
if (x1 > x2)
qSwap(x1, x2);
最后,在赫达文件中,也定义了一些有用的关数.因为这个海达文件是由其他所有的海达文件include制作的,所以不需要明示的include这个海达文件.该海达文件中,qAbs()返回了电脑的绝对值,qMin()和qMax()返回了2个值的最大值和最小值。