【问题标题】:Qt: How to subtract two QSet of QString in case insensitivity modeQt:如何在不区分大小写模式下减去 QString 的两个 QSet
【发布时间】:2011-05-04 13:25:18
【问题描述】:

我正在使用 Qt 解决一个逻辑问题。 我有两个 QSet 的 QString:

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

我想从 set2 中减去 set1,所以我使用:

set2.subtract( set1 );

我得到:

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

但在这种情况下,“bbb”并未从 set2 中删除,尽管 set1 包含此记录。 这是因为默认的 QString::contains 方法(它是 QSet::subtract 使用的方法)是区分大小写的。

还有另一个 QString::contains 方法,它接受一个参数来定义区分大小写模式,但我真的不知道如何使用它。

请问有人知道如何在两个 QString 的 QSet 之间进行不区分大小写的减法吗?

这是我迄今为止尝试过的:

将两个集合都转换为大写 set2 显示在一个列表中,因此如果所有项目都为大写(或都不为小写),则不会花哨。

扩展 QSet 类并覆盖减法 我尝试使用 MyStringSet 自定义类扩展这个类,但我对 Qt 不是很满意,这在我看来相当复杂。 p>

【问题讨论】:

    标签: c++ qt set qstring subtraction


    【解决方案1】:

    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;
    }
    

    【讨论】:

      【解决方案2】:

      最快的方法是像这样子类 QString 并覆盖比较器,在下面的示例中,我已经完成了相等运算符:

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

      【讨论】:

      • 谢谢,我说我对 Qt 不太满意。使用您的解决方案,我无法在我的 QSet 中插入任何 QString。所以我认为我需要保留我的 QSet 但我应该将我的 QString 转换为 QStringInsensitive。
      • 你怎么看?因为,我不知道我是否必须创建一个 QStringInsensitive(const QString&) 构造函数,或者强制转换。
      • 嗨,我试过这个解决方案没有成功:QString *entry; QStringInsensitive *entryInsensitive = qobject_cast(entry);我遇到了这个错误:没有匹配函数调用'qobject_cast(QString*&)' 我在互联网或文档中找不到任何示例来进行此转换。可能需要一些帮助,请:)
      • 好吧,错误很明显:QString没有继承QObject。我现在真的很困惑。 QObject不是所有Qt类的父类吗?
      • 简短回答是否定的。更长的答案是,只有需要处理信号和插槽的类才是 Qt 对象。 doc.qt.nokia.com/latest/qobject.html
      猜你喜欢
      • 2011-03-08
      • 2017-06-12
      • 2015-03-03
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 2014-07-14
      • 2020-03-03
      • 2013-03-06
      相关资源
      最近更新 更多