c++ - 我应该对只有 2 个项目的列表使用迭代器吗?

标签 c++ qt oop iterator

我已经编写了一个小型工作演示来说明我的问题。

我有一个复杂的模型,其中包含两个子模型(存储在 QList 中)。我的 View 可以根据用户想要看到的内容显示第一个子模型或第二个子模型。出于这个原因,我需要跟踪当前/事件/显示的子模型,并且我需要能够在需要显示时导航到另一个模型(因此也需要跟踪那个模型)。

我可以像下面的代码一样通过其指针存储当前子模型,但在我看来切换当前子模型可能会变得复杂 - 特别是如果我需要添加另一个子模型。

现在在我看来,迭代器可能是跟踪当前子模型和 next()hasNext() 以及 prev 的最佳方式()hasPrev() 从 UI 调用似乎很困难,但毕竟我应该使用迭代器,因为列表 (QList) 中只有两个项目吗?

代码如下(请大家见谅,我想简单说明一下我的问题)

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

    MyModel model;

    // prints current selected model name for sake of simplicity
    model.m_currentModel->print(); // output is "No1"

    return a.exec();
}

class MyModel : public QStandardItemModel
{
    Q_OBJECT
public:
    MyModel()
    {
        subModels.append( m_currentModel = new SubModel("No1") );
        subModels.append( new SubModel("No2") );
    }

    QList< SubModel*> subModels;

    SubModel * m_currentModel;
};

class SubModel : public QStandardItemModel
{
    Q_OBJECT
public:
    SubModel(QString name);

    QString m_name;

    void print()
    {
        qDebug() << m_name;
    }

};

请记住(如果重要的话)在我的真实项目中,子模型的选择时间更长,并且用户执行的所有操作都应用于该模型。我的应用程序只会并且始终有这 2 个子模型。

现在我应该使用 iterator 还是通过子模型的 pointer 来跟踪当前的子模型?

其他上下文信息: 我的应用程序有点像汽车装配线(但只有两辆车)。第一辆汽车上线(现在是当前汽车),应用程序将其配置为高级套餐。第二辆车进来了,现在是当前的车,它被配置为基本车。但是用户可以通过选择它作为当前(=事件)汽车来返回并查看以前汽车的配置。

最佳答案

您至少有三个选择:

  1. 指针 - 存储指向当前使用的项目的指针。这是轻量级、高效的,但更难使用,因为您没有概念或“下一个”或“上一个”等...

  2. 迭代器 - 迭代器设计用于 STL(或 Q-STL)并且是类固醇上的指针...所以您可以用它们做更多的事情,我会说它是一个更好的选择,但不是花费你更多的资源。

  3. 一个简单的索引,例如int activeCarId .这很简单,但对列表、 vector 等非常有效……因为你可以做到 ++-- ,您唯一需要注意的是列表限制,您可以随时查看 if (activeCarId < list.size()) ...

在这种情况下,我个人会使用一个简单的索引来跟踪。对你来说,交换规则很简单,你可以这样做:

if (++activeCarId >= list.size())
    activeCarId = 0;

如果 activeCarId 为 0 则它将变为 1。如果 activeCarId 为 1 它将变为 2,但由于 2 >= list.size() 它将被设置为 0。

我相信还有其他选择:)

关于c++ - 我应该对只有 2 个项目的列表使用迭代器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36089927/

相关文章:

c++ - 模板参数包在 Clang 上失败但在 VS 2015 上失败

c++ pthread 多线程,用于 2 x Intel Xeon X5570,Amazon EC2 HPC ubuntu 实例上的四核 CPU

c++ - 如何更改QCompleter的弹出列表的位置?

c++ - QGLWidget 在初始化后没有收到对 resizeGL 的调用

c++ - Qt Creator Sql 更新语法错误

c++ - 使用另一个类中的成员初始值设定项声明一个类的实例

qt - 如何根据窗口大小调整 QMainWindow 的内容

c++ - 从构造函数传递给成员函数时,私有(private)成员变量为空

java - 从 java 方法返回两个值

c++ - 将基类初始化为派生基类?