从QMap

时间:2015-12-14 10:24:35

标签: c++ qt

我有以下数据结构:

typedef QMap<QPair<QString, QString>, QString> UeTypeLoggedUsersData;

此数据结构的目的是存储记录的用户信息。 现在,我可以使用insert()插入数据,使用remove()删除数据,使用iterator进行迭代,效果非常好。但是,我如何QMap 获取最后添加的记录?我一直在阅读docs,但我找不到想要的信息。数据是按键排序,这里是示例调试输出:

"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”“”
最后被添加到数据结构中。正如我之前所问,我如何在此数据结构中获得最后添加的记录?

3 个答案:

答案 0 :(得分:3)

在我看来,您不需要这么复杂且可能难以管理的数据结构。您可以定义自己的名为UserData的类,然后为了存储它们,您可以定义QList<UserData>

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

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

避免重复

为避免重复条目,我建议在UserData类中重载==运算符,以便在语义上定义此类的两个实例相等。之后,您可以使用contains QList方法检查列表中是否已存在某个项目。

class UserData {
    public:
        bool operator == (const UserData &another){
            return this.key == another.key;
        }

    private:
        QString key;
}

现在,您可以检查这样的重复项:

if(!mList.constains(userData)){
    mList.append(userData);
}

答案 1 :(得分:2)

其实你做不到。

在基于红黑树的字典的Qt实现中

QMap。例如散列表,其中键,值对按键存储任意排序。因此,它可以快速查找与密钥相关的值。它不存储/包含有关按时间方式按键插入的值的任何内部信息。

如果您需要此类信息,则应使用更复杂的结构。例如:

typedef QHash<QString, QStringList> UeTypeLoggedUsersData;

所以你可以使用“c85bc9f7-704f-418e-98af-a1528622dd42”作为关键。正如我所见,你有常规的数据结构,所以你可以将值存储为关键子部分,将数据存储为QStringList的值:

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 :(得分:2)

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

最简单的方法是手动跟踪最后插入的元素,insert()返回一个迭代器,这样你就可以在QMap周围创建一个包装器,在每次插入后存储迭代器。