- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 QMap<QString, myStruct>
与
myStruct {
QString firstname;
QString lastname;
QString status;
}
如何对 QMap
进行排序根据优先顺序:status
然后firstname
然后lastname
?
最佳答案
据我了解,您想要检索以上述方式排序的 map 值,但仍可以访问键。对吧?
简而言之, map 是<key, value>
的集合。对自动按键排序,那么你可以试试<value, key>
的列表改为按值 手动排序。类似于 QList<QPair<myStruct, QString>>
, 同时覆盖 operator<
对于 myStruct
.
struct myStruct {
QString firstname;
QString lastname;
QString status;
bool operator<(const myStruct& o) const {
return std::tie(status, firstname, lastname) <
std::tie(o.status, o.firstname, o.lastname);
}
};
QMap<QString, myStatus> map; // your original map
QList<QPair<myStatus, QString>> inv;
// Populate the inverted list
for (auto k : map.keys()) {
inv.append(QPair<myStatus, QString>(map[k], k));
}
std::sort(std::begin(inv), std::end(inv));
for (auto p : inv) {
qDebug() << p.first.status << p.first.firstname << p.first.lastname << p.second;
}
当然,它是一次性使用的结构,不会与您的原始 map 保持更新,但您提到 map 是固定的(常量?)所以它可能不是那么问题来了。
顺便说一句,QMap
可用于反向查找,但仅适用于 myStruct
的值部分也是唯一的(因此它们也可以用作键),否则您可能会在构造逆映射时覆盖值。
注意: std::tie
仅用于简化元组的排序条件(因此您需要包含 <tuple>
)。
更新
回答您的评论之一:是的,您还可以指定自己的比较谓词,然后避免覆盖 operator<
,但我认为它更难阅读且不太可重用:
std::sort(std::begin(inv), std::end(inv),
[](const QPair<myStatus, QString>& lhs, const QPair<myStatus, QString>& rhs) {
return std::tie(lhs.first.status, lhs.first.firstname, lhs.first.lastname) <
std::tie(rhs.first.status, rhs.first.firstname, rhs.first.lastname);
});
当然,您可以根据需要实现比较 lambda,我使用了 std::tie
再次简化帖子中的逻辑。缺点是,如果您需要在多个地方生成逆映射,则必须在所有地方重复 lambda 表达式(当然也可以创建一个函数来创建逆映射)。
作为旁注,如果您好奇,lhs
和 rhs
分别指左手边和右手边,在本例中它们用作lhs < rhs
通过比较元素的排序算法。
最后,如果您想避免 std::tie
你必须手动进行比较(下面的代码修改了第一个版本的 operator<
):
bool operator<(const myStruct& o) const {
if (status < o.status) return true;
if (status > o.status) return false;
// status == o.status, move to next attribute
if (firstname < o.firstname) return true;
if (firstname > o.firstname) return false;
// firstname== o.firstname, move to next attribute
if (lastname < o.lastname) return true;
if (lastname > o.lastname) return false;
return false; // are equal
}
关于c++ - 如何对 QMap<QString, myStruct> 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46765436/
我经常看到这样的代码: if(myQMap.contains("my key")){ myValue = myQMap["my key"]; } 理论上在 QMap 中执行两次查找。 我的第一
我在 MS Visual C++ 2010 中使用 Qt 4.7.4。 我正在使用以下 QMap: QMap m_oMapHistHandle; 其中 T_FileMapKey 定义为: typed
QVariant (需要 QSettings 类)支持从 QMap 创建 但是尝试初始化这样的东西: QMap)> i; 给出错误: function returning a function. 然后
是否可以写和初始化 QMap> 在 Qt 5.10 中? 例如我想这样做 QMap> ee{"MAC", 0,0,}; // string, section 0, line 0 当我提供 Mac 时
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我在 Windows 8.1 上使用 Qt 5.5。当我运行下面的代码时,应用程序能够通过一次迭代,但在第二次迭代时崩溃。 100% 可重现。 (将其复制/粘贴到 Qt Creator 实例中并进行测
#include template TKey lastKeyOf(const QMap& map) { if (map.isEmpty()) throw something
我正在用 Qt 开发一款游戏。我的角色/对象存储在我的模型类中(我尝试遵循 MVC 模型)。 我为每个对象创建了一个 QMap : QMap *safes; QMap *mushroom; QMap
我想使用我之前创建的 QMap 在插槽内使用。我试过关注 this但它仍然没有用(我想我只是在做一些愚蠢的事情)。这是我正在使用的代码。 构造函数: QMap > tiles; connect(ui
我想在类里面使用 QMap,但出现错误: /* path */.h:18: error: template argument required for ‘class QMap’ class QMap
比较两个 QMaps 并删除不在第一个 map 中的条目并将第二个 map 的条目添加到第一个 map 中的最佳方法是什么?假设我有一张 map {1,2,3} 和一张 map {1,2,4} 我想保
我有一个 QMap 对象: QMap map; 我想通过 TCP 套接字发送它。我必须将其转换为 JSON 然后发送吗? 最佳答案 尝试使用这种方法: 在服务器端使用它来发送 map : // to
大家好 我有一个代码片段如下: class AppCtx { private: QMap pluginsMap; public : void addPlugin(IRzPlugin *plugin
我有一个问题。我想我正在做一些非常愚蠢的事情。我是 C++ 和 Qt 的新手。 我有一个类 SavedVar。我正在尝试向私有(private)成员 Qmap 添加键/值。当我调用 SavedVar:
作为一个新手 valgrind 用户,我无法弄清楚它输出以下消息的原因 40 bytes in 1 blocks are definitely lost in loss 违规代码行如下: void K
我找不到为 QMap 设置自定义比较器函数的方法,就像我可以为 std::map (其模板参数的 typename _Compare = std::less 部分)。 是否 QMap有办法设置吗? 最
我在 C++ 中工作,想创建一个带有 QMap 可选参数的函数。问题是我将默认值设置为什么。我希望它是一张空 map 。 void function(int i, QMap MyMap = ???)
我需要像 QMap 这样的结构,但不需要按键排序,所以如果我先在那里插入项目,我可以计算出这个项目将在所有其他项目之前。并在指定元素之前或之后插入对。 Qt有这样的吗? 最佳答案 QMap 以树的形式
我正在尝试在我的 QT 应用程序中使用此代码 QMap 但是它说存在构建问题 C:/****/****/****/***/domparser.h:14: error: type/value misma
我正在为 Qt 中的 REST API 创建某种路由器,但在将函数指针插入 QMap 时遇到了问题。 我有课IModule其他模块是从中派生出来的。IModule.h的重要线路是 typedef QB
我是一名优秀的程序员,十分优秀!