2011-05-04 3 views
3

Qt를 사용하여 논리적 인 문제를 해결하기 위해 노력하고 있습니다. QString의 내가있어 두 QSets :Qt : 무감각 모드에서 QString의 두 QSet을 빼는 방법

QSet<QString> set1: [ "aaa", "BBB" ] 
QSet<QString> set2: [ "aaa", "bbb", "ccc", "ddd" ] 

내가 설정 2에서 SET1을 빼기 원하는, 그래서 내가 사용 :

set2.subtract(set1); 

내가 얻을 :

set2: ["bbb", "ccc", "ddd"] 

그러나에 set1에이 레코드가 포함되어 있지만 대문자 "bbb"는 set2에서 제거되지 않습니다. 기본 QString :: contains 메서드 (QSet :: subtract에서 사용하는 메서드)는 대/소문자를 구분하기 때문입니다.

또 다른 QString :: contains 메서드가 매개 변수를 사용하여 대/소문자 구분 모드를 정의하지만 실제로 어떻게 사용할 수 있는지는 알 수 없습니다.

QString의 두 QSet 사이에서 대소 문자를 구분하지 않는 방법을 알고 싶으십니까?

는 여기에 지금까지 시도한 작업은 다음과 같습니다

SET2가 목록에 표시됩니다 대문자로 두 세트를 변환, 그래서 모든 항목이 (둘 또는 소문자) 대문자없는 경우는 공상되지 않습니다.

Qset 클래스를 확장하고 빼기 메서드를 재정의합니다.이 클래스를 MyStringSet 사용자 정의 클래스로 확장하려고 시도했지만 Qt에 익숙하지 않아 매우 복잡합니다.

답변

3

가장 빠른 방법은 하위 클래스에이 같은 QString하고 I는 항등 연산자했던 아래의 예에서, 비교기를 오버라이드 (override) 할 :

class QStringInsensitive: public QString 
    { 
    bool operator==(const QString& other) const 
    { 
     return (0 == this->compare(other, Qt::CaseInsensitive)); 
    } 
    }; 
    QSet<QStringInsensitive> set; 
+0

감사합니다, 제가 Qt는 꽤 불편 해요 말하는대로 : 당신은 단지 어떤 경우에는 소문자 구분이 필요하거나 표준 타입을 유도 엉망으로하지 않을 때 매우 유용합니다. 귀하의 솔루션으로, QString을 QSet 에 삽입 할 수 없습니다. 그래서 내 QSet 유지해야하지만 내 QString QStringInsensitive 캐스팅해야한다고 생각합니다. – Gildas

+0

당신은 어떻게 생각하십니까? 왜냐하면 QStringInsensitive (const QString &) 생성자를 생성해야하는지, 아니면 캐스팅해야하는지 모르겠습니다. – Gildas

+0

안녕하세요,이 솔루션을 성공적으로 시도했습니다 : QString * entry; QStringInsensitive * entryInsensitive = qobject_cast (입력); 'qobject_cast (QString * &)'에 대한 호출과 일치하는 함수가 없습니다. 인터넷이나 문서에서이 캐스트를 찾을 수 없습니다. 여기 좀 도와주세요 : – Gildas

8

Qt는 컨테이너 클래스 STL과 대부분 호환 가능합니다. 그리고 std :: set_difference는 비교자를 지정할 수있게 해준다.

struct qstring_compare_i 
{ 
    bool operator()(const QString & x, const QString y) const 
    { return QString::compare(x, y, Qt::CaseInsensitive) < 0; } 
}; 

static QSet<QString> substract_sets(const QSet<QString> & qs1, const QSet<QString> & qs2) 
{ 
    std::set<QString> r; 
    std::set_difference(qs1.begin(), qs1.end(), qs2.begin(), qs2.end(), std::inserter(r, r.end()), qstring_compare_i()); 

    QSet<QString> result; 
    for(std::set<QString>::iterator i=r.begin();i!=r.end();++i) { 
     result << *i; 
    } 
    return result; 
}