当前位置:编程学习 > wap >>

自定义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"]的值是什么? --------------------编程问答--------------------
引用 楼主 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么? --------------------编程问答-------------------- 题外:你可以直接使用 std::unordered_map ,如果你在使用较新的编译器 --------------------编程问答--------------------
引用 1 楼 heksn 的回复:
section.items["isSearchOnStart"]的值是什么?


是"0" --------------------编程问答--------------------
引用 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么?


那应该怎么改?我就想让它保持我插入的顺序,而不要排序 --------------------编程问答--------------------
引用 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么?


那应该怎么改?我就想让它保持我插入的顺序,而不要排序

就是说后插入的总是比先插入的大,总是排在先插入的后面 --------------------编程问答--------------------
引用 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么?


那应该怎么改?我就想让它保持我插入的顺序,而不要排序

就是说后插入的总是比先插入的大,总是排在先插入的后面



想想别的办法,不一定要用QMap或者std::map,map和set插入时排序要求强序,就是A < B 时 B > A 否则结果会意想不到。
--------------------编程问答-------------------- 还有一个可能的问题,map操作中,使用[]操作符是不安全的,如果map种没有这个元素,会添加一个元素 --------------------编程问答--------------------
引用 8 楼 foxyz 的回复:
还有一个可能的问题,map操作中,使用[]操作符是不安全的,如果map种没有这个元素,会添加一个元素

这个特性倒是对我有用。
--------------------编程问答--------------------
引用 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么?


那应该怎么改?我就想让它保持我插入的顺序,而不要排序

就是说后插入的总是比先插入的大,总是排在先插入的后面



想想别的办法,不一定要用QMap或者std::map,map和set插入时排序要求强序,就是A < B 时 B > A 否则结果会意想不到。

我的数据是键-值对(就是配置文件中的key=value),我希望能方便的获得value,而我已知的只有key,如果不使用map那应该选用哪种数据结构呢? 劳烦赐教! --------------------编程问答-------------------- 是否可以这样?
设计一个复合容器,包含一个vector和一个map
vector按顺序存储,这样可以通过map查找,同时又保留了插入的顺序
--------------------编程问答--------------------
引用 11 楼 ghosty_hand 的回复:
是否可以这样?
设计一个复合容器,包含一个vector和一个map
vector按顺序存储,这样可以通过map查找,同时又保留了插入的顺序

这样不行吧?map中的元素总是按key排序了啊。而且还引入了vector那我还得遍历vector才能查找到我想要的值啊。不知道我理解的跟你说的是不是一回事。 --------------------编程问答-------------------- 你这么用:

std::list<std::map<key, value> > YourContainer --------------------编程问答-------------------- 搞错了!这么用:
std::vector<std::pair> --------------------编程问答-------------------- 来学习的! 想问问楼主有答案了吗?
补充:移动开发 ,  Qt
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,