我已经编写了一个小型工作演示来说明我的问题。
我有一个复杂的模型,其中包含两个子模型(存储在 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
来跟踪当前的子模型?
其他上下文信息: 我的应用程序有点像汽车装配线(但只有两辆车)。第一辆汽车上线(现在是当前汽车),应用程序将其配置为高级套餐。第二辆车进来了,现在是当前的车,它被配置为基本车。但是用户可以通过选择它作为当前(=事件)汽车来返回并查看以前汽车的配置。
最佳答案
您至少有三个选择:
指针 - 存储指向当前使用的项目的指针。这是轻量级、高效的,但更难使用,因为您没有概念或“下一个”或“上一个”等...
迭代器 - 迭代器设计用于 STL(或 Q-STL)并且是类固醇上的指针...所以您可以用它们做更多的事情,我会说它是一个更好的选择,但不是花费你更多的资源。
一个简单的索引,例如
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/