c++ - Qt:如何在大小写不敏感模式下减去QString的两个QSet

标签 c++ qt set qstring subtraction

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

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 之间进行不区分大小写的减法?

这是我到目前为止尝试过的:

Transform both sets in uppercase set2 显示在一个列表中,所以如果所有项目都是大写(或小写都不是)就不会很花哨。

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

最佳答案

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

关于c++ - Qt:如何在大小写不敏感模式下减去QString的两个QSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5884135/

相关文章:

c++ - 正则表达式 - 条件替换

c++ - 结构的无符号字符别名

c++ - Qt + FreeType undefined reference

c++ - 加载 QPixmap 数据的更好方法

java - 使用 synchronizedSet 同步两个线程之间的访问

c++ - 谁能帮我把这个结构翻译成delphi记录?

c++ - 如何在 QStandardItemModel 中查找行

c# - 通过 C# 生成器的最大独立子集集

Java:是否有可能制作一组方法或任何类似的东西?

c++ - 从 C 应用程序加载的 C++ 插件使用 C++ 库