二维动态容器qt

时间:2013-10-01 21:47:44

标签: c++ qt dynamic containers

我正在写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]属于同一组。

1 个答案:

答案 0 :(得分:2)

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

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

另请考虑使用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;