c++ - (Qt C++)暂时 “disable” 2d map 中的一个键吗?

标签 c++ qt map key-value multidimensional-array

我正在一个有2d map 的项目中:

QMap < int, QMap < int, QPixmap> > slot_pic;

我设置了一个表来初始化值:
slot_pic[0][0] = QPixmap("path...");
slot_pic[1][0] = QPixmap("path...");
slot_pic[2][0] = QPixmap("path...");
slot_pic[3][0] = QPixmap("path...");
...

有时,第二个键会像这样更改:
...
slot_pic[300][0] = QPixmap("path...");
slot_pic[300][1] = QPixmap("path...");
slot_pic[300][2] = QPixmap("path...");
slot_pic[300][3] = QPixmap("path...");
slot_pic[301][0] = QPixmap("path...");
...

在程序的某个时刻,我遇到了一个只想看第一个数字的键。像素图的路径则仅取决于第一个键。像这样:
...
slot_pic[357][0] = QPixmap("path...");
slot_pic[358]    = QPixmap("path...");
slot_pic[359][0] = QPixmap("path...");
...

但是很明显,我收到语法错误。如果该键是我定义的数字,如何告诉我的程序仅查看第一个键? (358)我每次都可以这样写一千遍:
...
slot_pic[358][1] = QPixmap("path...");
slot_pic[358][2] = QPixmap("path...");
...
slot_pic[358][50] = QPixmap("path...");
slot_pic[358][55] = QPixmap("path...");
...

因此,基本上,如何使2D map 仅依赖于一个键?

注意:我不想更改第二个键的值,稍后在我的程序中需要它。我只想停止查看 map 中的某个键。

我试图尽我所能解释。任何帮助,将不胜感激 :)

最佳答案

方法1

使一个类具有2D vector 或2D map 的基础容器,但具有所需的所有访问器方法。

C++ multidimensional array operator

Operator[][] overload

然后,您可以在一个访问器方法的中间插入一个if语句,并使它返回空值或默认值,而不是存储的值(如果您以这种方式打开它的话)。

方法二

除了将pixmap存储在 map 中之外,还应存储一个结构,该结构除了具有pixmap之外,还具有诸如已打开或关闭的信息。

struct MyPixmap
{
    bool enabled;
    QPixmap pixmap;
}

方法3

将 map 的外层指向具有默认自变量系统的结构或类,以及指向 map 的功能。

希望能有所帮助。让我知道您是否需要更多信息或其中之一的更好示例。

编辑:这是一些使方法3起作用的代码。它使用模板。希望这是有道理的。您可能应该为MyMap实现一个复制构造函数,以及一个析构函数……但是如果没有它,它可能会起作用。

http://www.cplusplus.com/doc/tutorial/templates/

main.cpp
#include <QApplication>
#include "mymap.h"
#include <QString>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QMap < int, MyMap < int, QString> > slot_pic;

    slot_pic[0][0] = "0,0";
    slot_pic[1][0] = "1,0";
    slot_pic[2][0] = "2,0";
    slot_pic[3][0] = "3,0";

    slot_pic[300][0] = "300,0";
    slot_pic[300][1] = "300,1";
    slot_pic[300][2] = "300,2";
    slot_pic[300][3] = "300,3";
    slot_pic[301][0] = "301,0";

    slot_pic[357][0] = "357,0";
    slot_pic[358][0] = "358,0";
    slot_pic[359][0] = "359,0";

//    slot_pic[358].default_value() = slot_pic[0][0];

//    slot_pic[357][1] = slot_pic[358].default_value();

    qDebug() << slot_pic;

    qDebug() << slot_pic[358].default_value();

    qDebug() << slot_pic[300].default_value();

    return a.exec();
}

mymap.h
#ifndef MYMAP_H
#define MYMAP_H

#include <QMap>

template <class Key, class T>
class MyMap : public QMap <Key, T>
{
public:
    MyMap();

    T & operator[] ( const Key & key );

    T & default_value ();
private:
    Key m_default_key;
};

// Since template classes are generated
// on demand by the compiler, the implementation should
// stay in this class.

template <typename Key, typename T>
MyMap <Key, T>::MyMap(): QMap<Key, T>()
{

}

template <class Key, class T>
T & MyMap <Key, T>::operator[] ( const Key & key )
{
    // Store the key and use it as a default

    m_default_key = key;

    return QMap::operator [](key);
}

template <class Key, class T>
T & MyMap <Key, T>::default_value ()
{
    return QMap::operator [](m_default_key);
}

#endif // MYMAP_H

关于c++ - (Qt C++)暂时 “disable” 2d map 中的一个键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17645075/

相关文章:

c++ - 在 C 或 C++ 中释放内存

c++ - 旋转一个矩形

php - 如何在 PHP 中使用对象键创建类似数组的数据结构?

c++ - 使用 C++ 模板的数据映射器设计模式

c++ - 检查迭代器的类型是否为 reverse_iterator

c++ - 自动换行 ostream

c++ - QApplication 是懒惰的(或使应用程序中的其他线程懒惰)

qt - netbeans、Qt 和 Qmake "command not found"

c++ - C++ 的 vector 或映射或 HashMap ?

c - 父进程和子进程的内存映射文件问题