自定义Qmap的key类以去掉Qmap的自动排序功能

gao651201 2013-06-07 09:03:55
我想去掉Qmap的自动排序功能,于是自定义了一个类作为Qmap的key,并重新实现了该类的operator<()。程序编译运行没问题,但运行结果却不符合预期,大家帮忙看看问题出在哪里。

=========类定义:

class Config : public QDialog
{
Q_OBJECT
public:
explicit Config(QWidget *parent = 0);

class MapKey : public QString
{
public:
MapKey(){}
MapKey(const char *str):QString(str){}
MapKey(const QString &str):QString(str){}
bool operator < (const MapKey&) const {return true;}
};

typedef QMap<MapKey, QString> ConfigItems;
struct ConfigSection{
QString caption;
ConfigItems items;
};
typedef QMap<MapKey, ConfigSection> Configuration;
……
}


使用:

ConfigSection section;
section.caption = "[general]";
ConfigItems& items = section.items;
items["isSearchOnStart"] = QString("0"); // 设置值为0
conf[section.caption] = section;
ConfigSection& t = conf.begin().value();
qDebug()<<t.items.begin().key(); // 打印key,应为"isSearchOnStart"
qDebug()<<t.items.begin().value(); // 打印value,应为“0”
qDebug()<<t.items["isSearchOnStart"]; // 打印value,应为“0”


实际打印结果:
E:\Sissi\SVN\Qt\build-RemoteDisplayer-在本地运行-Debug\debug\RemoteDisplayer 启动中...
"isSearchOnStart"
"0"
"" // 此处期望的是"0"


为什么qDebug()<<t.items["isSearchOnStart"];打印出来的是""而不是"0"呢?问题出在哪?
...全文
3328 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bill_YING 2013-10-09
  • 打赏
  • 举报
回复
来学习的! 想问问楼主有答案了吗?
donwmufromdying 2013-06-10
  • 打赏
  • 举报
回复
搞错了!这么用: std::vector<std::pair>
donwmufromdying 2013-06-10
  • 打赏
  • 举报
回复
你这么用: std::list<std::map<key, value> > YourContainer
gao651201 2013-06-08
  • 打赏
  • 举报
回复
引用 11 楼 ghosty_hand 的回复:
是否可以这样? 设计一个复合容器,包含一个vector和一个map vector按顺序存储,这样可以通过map查找,同时又保留了插入的顺序
这样不行吧?map中的元素总是按key排序了啊。而且还引入了vector那我还得遍历vector才能查找到我想要的值啊。不知道我理解的跟你说的是不是一回事。
ghosty_hand 2013-06-08
  • 打赏
  • 举报
回复
是否可以这样? 设计一个复合容器,包含一个vector和一个map vector按顺序存储,这样可以通过map查找,同时又保留了插入的顺序
ghosty_hand 2013-06-07
  • 打赏
  • 举报
回复
引用 6 楼 gao651201 的回复:
[quote=引用 5 楼 gao651201 的回复:] [quote=引用 2 楼 dbzhang800 的回复:] [quote=引用 楼主 gao651201 的回复:] bool operator < (const MapKey&) const {return true;}
这一行错得有点厉害。 1. 首先,如果你不希望排序,就不该用QMap、std::map、等等 2. 你这一行,使得 A<B 和 B<A 同时成立(且永远成立),这是什么逻辑? 题外: A<B 和 B<A 同时不成立,意味着 A==B,但你这儿永远不可能会出现,你觉得还能让map找到key么?[/quote] 那应该怎么改?我就想让它保持我插入的顺序,而不要排序[/quote] 就是说后插入的总是比先插入的大,总是排在先插入的后面[/quote] 想想别的办法,不一定要用QMap或者std::map,map和set插入时排序要求强序,就是A < B 时 B > A 否则结果会意想不到。
gao651201 2013-06-07
  • 打赏
  • 举报
回复
引用 5 楼 gao651201 的回复:
[quote=引用 2 楼 dbzhang800 的回复:] [quote=引用 楼主 gao651201 的回复:] bool operator < (const MapKey&) const {return true;}
这一行错得有点厉害。 1. 首先,如果你不希望排序,就不该用QMap、std::map、等等 2. 你这一行,使得 A<B 和 B<A 同时成立(且永远成立),这是什么逻辑? 题外: A<B 和 B<A 同时不成立,意味着 A==B,但你这儿永远不可能会出现,你觉得还能让map找到key么?[/quote] 那应该怎么改?我就想让它保持我插入的顺序,而不要排序[/quote] 就是说后插入的总是比先插入的大,总是排在先插入的后面
gao651201 2013-06-07
  • 打赏
  • 举报
回复
引用 2 楼 dbzhang800 的回复:
[quote=引用 楼主 gao651201 的回复:] bool operator < (const MapKey&) const {return true;}
这一行错得有点厉害。 1. 首先,如果你不希望排序,就不该用QMap、std::map、等等 2. 你这一行,使得 A<B 和 B<A 同时成立(且永远成立),这是什么逻辑? 题外: A<B 和 B<A 同时不成立,意味着 A==B,但你这儿永远不可能会出现,你觉得还能让map找到key么?[/quote] 那应该怎么改?我就想让它保持我插入的顺序,而不要排序
gao651201 2013-06-07
  • 打赏
  • 举报
回复
引用 1 楼 heksn 的回复:
section.items["isSearchOnStart"]的值是什么?
是"0"
dbzhang800 2013-06-07
  • 打赏
  • 举报
回复
题外:你可以直接使用 std::unordered_map ,如果你在使用较新的编译器
dbzhang800 2013-06-07
  • 打赏
  • 举报
回复
引用 楼主 gao651201 的回复:
bool operator < (const MapKey&) const {return true;}
这一行错得有点厉害。 1. 首先,如果你不希望排序,就不该用QMap、std::map、等等 2. 你这一行,使得 A<B 和 B<A 同时成立(且永远成立),这是什么逻辑? 题外: A<B 和 B<A 同时不成立,意味着 A==B,但你这儿永远不可能会出现,你觉得还能让map找到key么?
  • 打赏
  • 举报
回复
section.items["isSearchOnStart"]的值是什么?
gao651201 2013-06-07
  • 打赏
  • 举报
回复
引用 7 楼 ghosty_hand 的回复:
[quote=引用 6 楼 gao651201 的回复:] [quote=引用 5 楼 gao651201 的回复:] [quote=引用 2 楼 dbzhang800 的回复:] [quote=引用 楼主 gao651201 的回复:] bool operator < (const MapKey&) const {return true;}
这一行错得有点厉害。 1. 首先,如果你不希望排序,就不该用QMap、std::map、等等 2. 你这一行,使得 A<B 和 B<A 同时成立(且永远成立),这是什么逻辑? 题外: A<B 和 B<A 同时不成立,意味着 A==B,但你这儿永远不可能会出现,你觉得还能让map找到key么?[/quote] 那应该怎么改?我就想让它保持我插入的顺序,而不要排序[/quote] 就是说后插入的总是比先插入的大,总是排在先插入的后面[/quote] 想想别的办法,不一定要用QMap或者std::map,map和set插入时排序要求强序,就是A < B 时 B > A 否则结果会意想不到。 [/quote] 我的数据是键-值对(就是配置文件中的key=value),我希望能方便的获得value,而我已知的只有key,如果不使用map那应该选用哪种数据结构呢? 劳烦赐教!
gao651201 2013-06-07
  • 打赏
  • 举报
回复
引用 8 楼 foxyz 的回复:
还有一个可能的问题,map操作中,使用[]操作符是不安全的,如果map种没有这个元素,会添加一个元素
这个特性倒是对我有用。
donwmufromdying 2013-06-07
  • 打赏
  • 举报
回复
还有一个可能的问题,map操作中,使用[]操作符是不安全的,如果map种没有这个元素,会添加一个元素

21,489

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧