自定义Qmap的key类以去掉Qmap的自动排序功能
我想去掉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"呢?问题出在哪? Qt Qmap key自动排序 --------------------编程问答-------------------- section.items["isSearchOnStart"]的值是什么? --------------------编程问答--------------------
这一行错得有点厉害。
1. 首先,如果你不希望排序,就不该用QMap、std::map、等等
2. 你这一行,使得 A<B 和 B<A 同时成立(且永远成立),这是什么逻辑?
题外:
A<B 和 B<A 同时不成立,意味着 A==B,但你这儿永远不可能会出现,你觉得还能让map找到key么? --------------------编程问答-------------------- 题外:你可以直接使用 std::unordered_map ,如果你在使用较新的编译器 --------------------编程问答--------------------
是"0" --------------------编程问答--------------------
那应该怎么改?我就想让它保持我插入的顺序,而不要排序 --------------------编程问答--------------------
bool operator < (const MapKey&) const {return true;}
这一行错得有点厉害。
1. 首先,如果你不希望排序,就不该用QMap、std::map、等等
2. 你这一行,使得 A<B 和 B<A 同时成立(且永远成立),这是什么逻辑?
题外:
A<B 和 B<A 同时不成立,意味着 A==B,但你这儿永远不可能会出现,你觉得还能让map找到key么?
那应该怎么改?我就想让它保持我插入的顺序,而不要排序
就是说后插入的总是比先插入的大,总是排在先插入的后面 --------------------编程问答--------------------
bool operator < (const MapKey&) const {return true;}
这一行错得有点厉害。
1. 首先,如果你不希望排序,就不该用QMap、std::map、等等
2. 你这一行,使得 A<B 和 B<A 同时成立(且永远成立),这是什么逻辑?
题外:
A<B 和 B<A 同时不成立,意味着 A==B,但你这儿永远不可能会出现,你觉得还能让map找到key么?
那应该怎么改?我就想让它保持我插入的顺序,而不要排序
就是说后插入的总是比先插入的大,总是排在先插入的后面
想想别的办法,不一定要用QMap或者std::map,map和set插入时排序要求强序,就是A < B 时 B > A 否则结果会意想不到。
--------------------编程问答-------------------- 还有一个可能的问题,map操作中,使用[]操作符是不安全的,如果map种没有这个元素,会添加一个元素 --------------------编程问答--------------------
还有一个可能的问题,map操作中,使用[]操作符是不安全的,如果map种没有这个元素,会添加一个元素
这个特性倒是对我有用。
--------------------编程问答--------------------
bool operator < (const MapKey&) const {return true;}
这一行错得有点厉害。
1. 首先,如果你不希望排序,就不该用QMap、std::map、等等
2. 你这一行,使得 A<B 和 B<A 同时成立(且永远成立),这是什么逻辑?
题外:
A<B 和 B<A 同时不成立,意味着 A==B,但你这儿永远不可能会出现,你觉得还能让map找到key么?
那应该怎么改?我就想让它保持我插入的顺序,而不要排序
就是说后插入的总是比先插入的大,总是排在先插入的后面
想想别的办法,不一定要用QMap或者std::map,map和set插入时排序要求强序,就是A < B 时 B > A 否则结果会意想不到。
我的数据是键-值对(就是配置文件中的key=value),我希望能方便的获得value,而我已知的只有key,如果不使用map那应该选用哪种数据结构呢? 劳烦赐教! --------------------编程问答-------------------- 是否可以这样?
设计一个复合容器,包含一个vector和一个map
vector按顺序存储,这样可以通过map查找,同时又保留了插入的顺序
--------------------编程问答--------------------
是否可以这样?
设计一个复合容器,包含一个vector和一个map
vector按顺序存储,这样可以通过map查找,同时又保留了插入的顺序
这样不行吧?map中的元素总是按key排序了啊。而且还引入了vector那我还得遍历vector才能查找到我想要的值啊。不知道我理解的跟你说的是不是一回事。 --------------------编程问答-------------------- 你这么用:
std::list<std::map<key, value> > YourContainer --------------------编程问答-------------------- 搞错了!这么用:
std::vector<std::pair> --------------------编程问答-------------------- 来学习的! 想问问楼主有答案了吗?
补充:移动开发 , Qt