二维动态容器 qt

2 dimensional dynamic container qt

本文关键字:qt 动态 二维      更新时间:2023-10-16

我正在编写kmeans算法。我需要一些 2D 动态容器来存储点组。这里有一些代码

void KMeans::initialPartitionPoints()
{
    QTime time = QTime::currentTime();
    qsrand((uint)time.msec());
    for (int i = 0; i < numberOfClusters(); i++)
    {
        qint64 randomValue = qrand() % _points->size();
        _centroids.push_back(new Centroid(_points->at(randomValue)));
    }
    for (int i = 0; i < _points->size(); i++)
    {
        int cluster;
        qreal bestDistance = std::numeric_limits<qreal>::max();
        qreal distance;
        for (int j = 0; j < _centroids.size(); j++)
        {
            distance = _distanceMeasure->calculateDistance(_centroids.at(j), _points->at(i));
            if (distance < bestDistance)
            {
                bestDistance = distance;
                cluster = j;
            }
        }
        WHAT HERE TO STORE i POINT IN j GROUP?
    }
}

_centroids - 是作为组中心的点列表

_points - 是所有点的列表

现在我怎样才能制作类似 QList< QList<Point*> > _clusters 的东西来将点存储在集群中,其中构造函数中给出了列数并且每列的元素(行)数未知。我的意思是我如何初始化第一个 QList 并设置元素数量,然后如何将第二个 QList 用作动态(自动调整大小)容器(QList::append())

cluster是一个组号,其中_centroids[cluster]_clusters[cluster][somePoint]的这个组相同。

您可以使用

QList< QList<Point*> >,它将起作用。您需要手动将每个项目逐个添加到所有列表中。

但我认为,如果您不需要在任意位置插入项目并从列表中删除任意项目,您应该使用 QVector 而不是 QList。QVector 可以使用 resize() 轻松调整大小。按索引获取和设置元素的速度更快。内存消耗较低。

此外,请考虑使用 Point 而不是 Point* 作为模板类型。应尽可能使用自动内存管理。

例:

QVector< QVector<Point> > matrix(row_count);
for(int row = 0; row < row_count; i++) {
  matrix[row].resize(column_count);
}
//...
matrix[row][column] = some_value;