首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从QMap获取最后插入/添加的项

从QMap获取最后插入/添加的项
EN

Stack Overflow用户
提问于 2015-12-14 10:24:35
回答 3查看 2.3K关注 0票数 2

我有以下数据结构:

代码语言:javascript
复制
typedef QMap<QPair<QString, QString>, QString> UeTypeLoggedUsersData;

此数据结构的目的是存储已记录的用户信息。现在,我可以用insert()插入数据,用remove()删除数据,用iterator迭代它,它可以完美地工作。但是,我如何从QMap获得最后一次添加的记录?我一直在读文档,但我根本找不到想要的信息。数据是按键排序的,下面是示例调试输出:

代码语言:javascript
复制
"c85bc9f7-704f-418e-98af-a1528622dd42" "1" ""
"c85bc9f7-704f-418e-98af-a1528622dd42" "10" ""
"c85bc9f7-704f-418e-98af-a1528622dd42" "12" ""
"c85bc9f7-704f-418e-98af-a1528622dd42" "4" ""
"c85bc9f7-704f-418e-98af-a1528622dd42" "7" ""
"c85bc9f7-704f-418e-98af-a1528622dd42" "9" ""

但是,从调试过程中我知道(在这种情况下),记录

"c85bc9f7-704f-418e-98af-a1528622dd42“"4”

最后一次添加到数据结构中。正如我前面所问的,我如何在这个数据结构中得到最后一次添加记录?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-14 11:15:56

在我看来,您不会需要如此复杂和潜在的难以管理的数据结构。您可以定义自己的类UserData,然后为了存储它们,您可以定义一个QList<UserData>

我认为你需要一袋用户数据,而不是一个有序的列表。如果是这样的话,QList完全符合您的要求。

  • QList::first()返回第一项。
  • QList::last()返回最后一项。

避免重复

为了避免重复条目,我建议在UserData类中重载==操作符,以便语义上定义该类的哪两个实例相等。然后,可以使用QListQList方法来检查列表中是否已经存在某个项。

代码语言:javascript
复制
class UserData {
    public:
        bool operator == (const UserData &another){
            return this.key == another.key;
        }

    private:
        QString key;
}

现在,您可以检查如下所示的副本:

代码语言:javascript
复制
if(!mList.constains(userData)){
    mList.append(userData);
}
票数 3
EN

Stack Overflow用户

发布于 2015-12-14 10:34:39

其实你做不到。

QMap在Qt实现中基于红黑树的字典。例如哈希表中的键,值对存储任意按键排序.因此,它提供了与键关联的值的快速查找。它不存储/包含任何关于按键以时间方式插入的值的内部信息。

如果您需要这样的信息,您应该为此使用更复杂的结构。例如:

代码语言:javascript
复制
typedef QHash<QString, QStringList> UeTypeLoggedUsersData;

所以你可以用"c85bc9f7-704f-418e-98af-a1528622dd42“作为键。正如我所看到的,您有规则的数据结构,因此可以将值存储为关键子部分,将数据存储为QStringList的值:

代码语言:javascript
复制
QString key = "c85bc9f7-704f-418e-98af-a1528622dd42";
if (myHash.contains(key)) {
    myHash[key] << "10";
    myHash[key] << "some data";
} else {
    QStringList usersData;
    usersData << "10"
    usersData << "some data"
    myHash[key] = usersData;
}

因此,它更复杂,但你总是可以得到最新的附加值。

票数 2
EN

Stack Overflow用户

发布于 2015-12-14 10:49:52

QMap是一个排序的容器-新条目不是按时间顺序插入的,而是基于键。因此,last()不会引用最后插入的元素,而是引用具有“最大”键的元素。

最简单的方法是手动跟踪最后一个插入的元素,insert()返回一个迭代器,这样您就可以在每次插入之后对QMap做一个包装器来存储该迭代器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34264624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档