std::vector::size()
返回一个size_type
无符号的,通常是相同的size_t
,例如64位平台上的8个字节.
相比之下,即使在64位平台上也会QVector::size()
返回一个int
通常为4个字节的数据,并且它会被签名,这意味着它只能在2 ^ 32的一半时间内返回.
这是为什么?这似乎非常不合逻辑并且在技术上也有限制,虽然你很可能不需要超过2 ^ 32个元素,但是使用signed int会减少一半,这是没有明显的理由.也许是为了避免编译器警告让人们懒得声明i
为一个uint
而不是一个int
谁决定让所有容器返回一个没有意义的大小类型是一个更好的解决方案?原因可能不是那么愚蠢?
我的问题基本上是什么时候选择QVector
以及何时选择QList
作为你的Qt容器.我所知道的:
对于大多数用途,QList是正确的类.它的基于索引的API比QLinkedList的基于迭代器的API更方便,并且它通常比QVector更快,因为它将其项目存储在内存中.它还扩展到可执行文件中较少的代码.
这是非常受欢迎的问答:QVector vs QList.它也有利于QList.
但是:在最近的2015年Qt世界峰会上,KDAB提出了"为什么QList有害",这基本上是在这里:
不要使用QList,请使用Q_DECLARE_TYPEINFO
据我所知,这个想法是,QList
在堆中分配新元素时,几乎所有类型都是低效的.每次添加新元素时,它都会调用new
(每个元素一次),与之相比,这是低效的QVector
.
这就是我现在试图理解的原因:QVector
我们应该选择哪个默认容器?
Qt的容器类QList<T>
,QVector<T>
等需要它们的元素类型是可复制.从C++ 11开始,STL容器要求它们的元素类型只能是可复制的或可移动的.为什么Qt容器不支持仅移动元素类型?
我是c ++和Qt的新手,我正在尝试初始化一个QVector,它是类初始化列表中的类成员,如:
MyClass::MyClass(QWidget *parent) : QMainWindow(parent) , myVector(QVector<double>(100))
Run Code Online (Sandbox Code Playgroud)
我期待QVector已经有100个索引,但是当我尝试读取时,myVector[0]
我得到一个断言错误,说"test.exe中的0x0143bf77处的未处理异常:0xC0000005:访问冲突读取位置0x00000004." 程序在Qt的这一行停止:
inline T &QVector<T>::operator[](int i)
{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range");
return data()[i]; }
Run Code Online (Sandbox Code Playgroud)
我相信这表明我正在尝试访问尚未分配的成员,所以我想我没有正确使用初始化列表.我可以把它作为一个指针并new QVector(100)
在构造函数中创建一个但我想知道什么是错的,我怎么能使它正确.
我可以看到这些类被视为调用默认构造函数所需的复杂对象:
void QVector<T>::defaultConstruct(T *from, T *to)
{
if (QTypeInfo<T>::isComplex) {
while (from != to) {
new (from++) T();
}
...
}
Run Code Online (Sandbox Code Playgroud)
但目前尚不清楚为什么需要在QVector的"隐藏"区域构建对象.我的意思是这些对象根本不可访问,那么为什么不保留内存而不是真正的对象创建呢?
作为奖励的问题,我想问一下,如果我想有非默认constractible对象的数组,可我安全地更换QVector<T>
有QVector<Wrapper<T>
?在哪里Wrapper
是这样的:
class Wrapper {
public:
union {
T object;
bool hack;
};
Wrapper() {}
Wrapper(const T &t) : object { t } {}
Wrapper(const Wrapper &t) : object { t.object } {}
Wrapper &operator=(const Wrapper &value) {
object = value.object;
return *this;
}
~Wrapper() {}
};
Run Code Online (Sandbox Code Playgroud) 我很困惑为什么这不起作用.我必须误解QVectors的一些关键...
我创建了一个MCVE来显示问题:
#include <QCoreApplication>
#include <QVector>
struct ChunkRequest
{
ChunkRequest(int x, int z)
{
this->x = x;
this->z = z;
}
int x;
int z;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QVector<ChunkRequest> requestedChunks;
requestedChunks.append(ChunkRequest(1, 2));
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
编译会抛出错误 C2512: 'ChunkRequest' : no appropriate default constructor available
我能够创建一个ChunkRequest
变量,ChunkRequest req(1, 2);
但是一旦我尝试将它附加到我QVector
的错误抛出.
我有理由感到困惑.
编辑:在阅读您的评论之后,我很清楚QVector需要一个默认构造函数来确定数组中每个元素的大小.但这并没有回答为什么.
如果一个struct有一定数量的成员,并且每个成员在内存中都有已知的大小(即使指向动态内存的指针是已知大小),那么我不明白为什么QVector需要一个默认的构造函数?大小应该在编译时知道......对吗?
我似乎在使用Qt中的基本向量时遇到问题,我不断收到编译错误.具体信息将在下面发布:
代码段:
....
#include <QVector>
#include <QString>
QVector<QString> vector;
vector.append("sometext");
Run Code Online (Sandbox Code Playgroud)
错误信息:
'vector' does not name a type
Run Code Online (Sandbox Code Playgroud)
对于与创建的向量直接相关的任何代码而不仅仅是append函数,都会出现此错误.任何洞察我做错的事情都会受到赞赏.矢量存在.我通过使用一个项目初始化所有元素并在程序的其他部分访问它来测试它.
我有一个 QVector
QVector(48, 64, 31, -2, 14, 5, 7, -3, -1, 13)
Run Code Online (Sandbox Code Playgroud)
我想知道如何使用Qt机制删除所有小于0的元素。
如何以简单的方式执行此操作?
谢谢
我有一个B类,它创建一个A类的对象并调用该对象的方法.
啊
#ifndef A_H
#define A_H
class A
{
public:
A(int);
void function();
};
#endif // A_H
Run Code Online (Sandbox Code Playgroud)
a.cpp
#include "a.h"
A::A(int x)
{
}
void A::function(){
//Do something.
}
Run Code Online (Sandbox Code Playgroud)
BH
#ifndef B_H
#define B_H
#include <QVector>
#include <a.h>
class B
{
public:
B(int);
QVector<A> list;
};
#endif // B_H
Run Code Online (Sandbox Code Playgroud)
b.cpp
#include "b.h"
B::B(int y)
{
list.append(A(y));
list[0].function();
}
Run Code Online (Sandbox Code Playgroud)
问题是这不能编译.它返回"没有匹配的函数来调用'A:A()'".我知道这可以通过前向声明来解决,但这在这里不起作用,因为我想调用函数"function".我也不想把全班A都包括在B班.
我是 Qt Creator 的新手(版本 4.10.0,基于 Qt 5.13.1)。我已经接受了customitemgraph example
,我想.obj
用新文件替换现有文件。我从网上下载了一些免费模型。其中一些有效,但另一些则无效。
这是两个例子。
使用记事本打开的文件的摘录.obj
,该文件正在运行
...
vn 0.3531 -0.8627 -0.3620
vn 0.3815 -0.9243 -0.0148
usemtl Default_OBJ
s 1
f 1/1/1 2/2/2 3/3/3 4/4/4
f 2/2/2 5/5/5 6/6/6 3/3/3
f 4/4/4 3/3/3 7/7/7 8/8/8
...
Run Code Online (Sandbox Code Playgroud)
一个不工作的情况:
...
vn -0.1013 -0.8959 -0.4325
vn -0.1003 -0.8978 -0.4287
usemtl Body
s 1
f 225536//133387 225537//133388 225544//133389 225543//133390
f 225537//133388 225538//133391 225545//133392 225544//133389
f 225538//133391 225539//133393 225546//133394 225545//133392
f 225539//133393 225540//133395 225547//133396 225546//133394
... …
Run Code Online (Sandbox Code Playgroud)