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中获取指向原始数据的指针?
答案 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();