我有以下数据结构:
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”“”
最后被添加到数据结构中。正如我之前所问,我如何在此数据结构中获得最后添加的记录?
答案 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
周围创建一个包装器,在每次插入后存储迭代器。