我有以下数据结构:
typedef QMap<QPair<QString, QString>, QString> UeTypeLoggedUsersData;此数据结构的目的是存储已记录的用户信息。现在,我可以用insert()插入数据,用remove()删除数据,用iterator迭代它,它可以完美地工作。但是,我如何从QMap?获得最后一次添加的记录?我一直在读文档,但我根本找不到想要的信息。数据是按键排序的,下面是示例调试输出:
"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”
最后一次添加到数据结构中。正如我前面所问的,我如何在这个数据结构中得到最后一次添加记录?
发布于 2015-12-14 11:15:56
在我看来,您不会需要如此复杂和潜在的难以管理的数据结构。您可以定义自己的类UserData,然后为了存储它们,您可以定义一个QList<UserData>。
我认为你需要一袋用户数据,而不是一个有序的列表。如果是这样的话,QList完全符合您的要求。
QList::first()返回第一项。QList::last()返回最后一项。避免重复
为了避免重复条目,我建议在UserData类中重载==操作符,以便语义上定义该类的哪两个实例相等。然后,可以使用QList的QList方法来检查列表中是否已经存在某个项。
class UserData {
public:
bool operator == (const UserData &another){
return this.key == another.key;
}
private:
QString key;
}现在,您可以检查如下所示的副本:
if(!mList.constains(userData)){
mList.append(userData);
}发布于 2015-12-14 10:34:39
其实你做不到。
QMap在Qt实现中基于红黑树的字典。例如哈希表中的键,值对存储任意按键排序.因此,它提供了与键关联的值的快速查找。它不存储/包含任何关于按键以时间方式插入的值的内部信息。
如果您需要这样的信息,您应该为此使用更复杂的结构。例如:
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;
}因此,它更复杂,但你总是可以得到最新的附加值。
发布于 2015-12-14 10:49:52
QMap是一个排序的容器-新条目不是按时间顺序插入的,而是基于键。因此,last()不会引用最后插入的元素,而是引用具有“最大”键的元素。
最简单的方法是手动跟踪最后一个插入的元素,insert()返回一个迭代器,这样您就可以在每次插入之后对QMap做一个包装器来存储该迭代器。
https://stackoverflow.com/questions/34264624
复制相似问题