首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >QStringList 去除重复项算法赏析

QStringList 去除重复项算法赏析

作者头像
全栈程序员站长
发布2022-09-06 15:41:01
发布2022-09-06 15:41:01
1.6K0
举报

大家好,又见面了,我是你们的朋友全栈君。

测试用例:

代码语言:javascript
复制
    QStringList list;
    list<<"2222"<<"xxx"<<"1111"<<"2222"<<"xxxx"<<"1111";
    int n=list.removeDuplicates();

源代码:

代码语言:javascript
复制
/*!
    \fn int QStringList::removeDuplicates()

    \since  4.5

    This function removes duplicate entries from a list.
    The entries do not have to be sorted. They will retain their
    original order.

    Returns the number of removed entries.
*/
int QtPrivate::QStringList_removeDuplicates(QStringList *that)
{
    int n = that->size();
    int j = 0;
    QSet<QString> seen;
    seen.reserve(n);
    int setSize = 0;
    for (int i = 0; i < n; ++i) {
        const QString &s = that->at(i);
        seen.insert(s);
        if (setSize == seen.size()) // unchanged size => was already seen
            continue;
        ++setSize;
        if (j != i)
            that->swap(i, j);    //将不重复项与重复项交换
        ++j;
    }
    if (n != j)
        that->erase(that->begin() + j, that->end());
    return n - j;
}

以上述list为例:

代码语言:javascript
复制
list<<"2222"<<"xxx"<<"1111"<<"2222"<<"xxxx"<<"1111";

循环执行:

第一次:不存在重复项。2222 插入seen. setSize=1 j=1

第二次:不存在重复项。xxx 插入seen. setSize=2 j=2

第三次:不存在重复项。1111 插入seen. setSize=3 j=3

第四次: 存在重复项。 continue; setSize=3 j=3

第五次:不存在重复项。xxxx插入seen. setSize=4 j=3 此时i不等于j。that->swap()执行 xxxx将与后一个2222交换位置;setSize=4 j=4

第六次:存在重复项。 continue; setSize=4 j=4

循环完毕:

执行:

代码语言:javascript
复制
that->erase(that->begin() + j, that->end());

删掉最后的两项。

剩余列表:

代码语言:javascript
复制
list<<"2222"<<"xxx"<<"1111"<<"xxxx";

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134485.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年6月6,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档