如何在Qt容器中获取指向原始数据的指针?

时间:2014-03-18 07:04:47

标签: c++ qt pointers containers

This显示了如何在std :: vector中访问指向原始数据的指针。我想在Qt中为QVector,QQueue和QList(如果可能的话还有其他容器)那样的东西。

例如,如果我们有一些容器:

QVector<int> vector;
QQueue<int> queue;
QList<int> list;

这些指示:

int * p1 = &vector[0];
int * p2 = &queue[0];
int * p3 = &list[0];

上述指针是否指向容器中的原始数据?

对于上述情况,我做了一个测试。代码是:

QVector<int> vector;
QQueue<int> queue;
QList<int> list;

for(int i=0;i<10;i++)
{
    vector.append(i);
    queue.enqueue(i);
    list.append(i);
}

int * P1 = &vector[0];
int * P2 = &queue[0];
int * P3 = &list[0];

for(int i=0;i<10;i++)
    qDebug()<<P1[i]<<P2[i]<<P3[i]<<"\n";

结果是:

0 0 0

1 1 1

2 2 2

3 3 3

4 4 4

5 5 5

6 6 6

7 7 7

8 8 8

9 9 9

所以至少对于int type的情况是这样的。

但是双重类型的相同测试失败了。只有QVector元素对于double类型是正确的。

是否可以在QQueue和QList中获取指向原始数据的指针?

2 个答案:

答案 0 :(得分:2)

这似乎不是一个好主意,可能会在将来的某个随机点出现分段错误。 QList和QQueue没有data()功能的原因是QList没有 保证 列表项在内存中彼此相邻。比较:

  

QVector是Qt的通用容器类之一。 它将项目存储在相邻的内存位置,并提供快速的基于索引的访问。

VS

  

List是Qt的通用容器类之一。 它存储值列表,并提供快速的基于索引的访问以及快速插入和删除。

您的测试表明它现在可以正常工作,它似乎也可以使用10000或1000000项。但这是一个实施细节,并且无法保证Qt的某些未来版本不会出于性能或其他原因而改变QList的内部工作方式。

此外,还有一个问题:大于指针的所有东西(例如QList<someStruct>)只会作为指针存储在列表中,而实际的项目会驻留在堆上。

事实上,Qt文档指出QList内部使用数组:

  

在内部,QList是使用数组实现的,确保基于索引的访问速度非常快。

但即使这并不一定意味着所有项目都是连续的。人们可能会想到一个牵强的实现,其中列表存储项目块,这样每个块都是一个单独的数组。

答案 1 :(得分:1)

可以使用Qt功能正确完成。 例如:

QVector<int> vector;
int* ptr = vector.data();