小编Phl*_*ous的帖子

你可以在C++中逐位转换bool吗?

我正在使用别人的代码,该代码是用较旧的编译器编写的,它将特殊BOOL类型unsigned int映射到a,但在我的编译器中它映射到true bool.在他的代码一些地方他使用的按位移位运算符<<bool类型,这是我以前从未见过和我的编译器让我感到惊讶时,它并没有抱怨.

这是有效的C++吗?是bool自动升级为intuint

我看到了这个相关的问题,它提供了另一个问题的清晰度,但它并没有解决转变运算符.

c++ bit-shift

15
推荐指数
1
解决办法
1138
查看次数

我在哪里将形状存储在八叉树中?

到目前为止,关于设计决策的一些背景......我开发了一种可以存储点的八叉树结构.我选择基于某个基本体素大小来限制"世代"的递归.只有在将点添加到该节点时才会创建子节点.这不是动态图形应用程序 - 这个八叉树及其中的对象是静态的,因此不需要考虑提高性能的预处理.

现在,我想在我的八叉树中添加"形状" - 特别是由三角形组成的表面网格.这些三角形的顶点不对应于存储在八叉树中的点.如何在八叉树中存储这些形状?我看到两个选择......

Alt 1:在它穿过的每个叶节点中存储三角形. Alt 2:在可以容纳每个顶点的最小节点中存储三角形.

灰色节点是"空的",因为它们没有形状.在备选方案1中,形状存储在它们相交的每个节点中 - 即,节点1a包含shape1和4c和4d共享shape2.在备选方案2中,形状仅存储在它们相交的最小节点中 - 即,节点1a包含shape1而节点4包含shape2.

我见过的八角树上的大多数帖子都假设为Alt1,但他们从未解释过为什么.Alt2对我来说更有意义,只会为那些驻留在节点边界上的形状创建额外的工作.为什么Alt1更受欢迎?

编辑:为了澄清,我使用的实现语言是C++,所以我更喜欢该语言的示例实现,但问题是与语言无关.对不起,如果标签使用不正确.

编辑2:虽然与形状存储问题没有直接关系,但这个链接对问题背后的八叉树遍历有很好的讨论.我认为这可能有助于任何有兴趣研究这个问题的人.


更新:四年后,Alt2最终变得更容易实现,但速度非常慢,因为在八叉树的每次遍历中都会测试存储在较高八叉树级别的大三角形 - 在我的情况下,这意味着需要进行数百到数千次不必要的测试.我最后修改了我的代码以使用R*-Tree变体,这很容易实现并且速度更快.

c++ spatial-index data-structures octree

12
推荐指数
1
解决办法
1646
查看次数

PythonQt已被弃用吗?

我有一个C++应用程序,我正在使用Visual Studio 2010编译,需要能够调用几个python脚本并读取它们的输出,但我不能指望在计算机上安装Python.PythonQt似乎是一个受欢迎的简单选项,但我见过的每个帖子都是2009年或更早的日期.主要教程甚至还说TrollTech.

这使我认为这种方法/类已过时或可能已弃用.boost :: Python是现在的方式,还是PythonQt仍然可以做到这一点,或者我应该像其他人一样以正常的C++方式嵌入Python

c++ python qt

8
推荐指数
1
解决办法
2863
查看次数

QVariant :: QVariant(Qt :: GlobalColor)'是私有的

头文件中的声明

QColor dialogBoja, dialogBoja1;
Run Code Online (Sandbox Code Playgroud)

.cpp文件

dialogBoja = postavke.value("boja", Qt::black).toString();
//postavke means settings
dialogBoja1 = postavke.value("boja1", Qt::white).toString();
Run Code Online (Sandbox Code Playgroud)

正如我在标题上所说,当我尝试在Qt5中编译它时,我得到错误:QVariant :: QVariant(Qt :: GlobalColor)'是私有的

怎么解决这个问题.

qt qt5

7
推荐指数
1
解决办法
4952
查看次数

堆上的多线程(de)分配

我有一个非常大的~30M对象,每个大约80字节 - 对于那些跟随的人来说是~2.2GB - 存储在磁盘上.每个对象的实际大小略有不同,因为每个对象都有一个QMap<quint32, QVariant>孩子.

从原始数据中解压缩这些对象是很昂贵的,所以我实现了一个多线程读取操作,它顺序从磁盘中提取几MB ,然后将每个原始数据块传递给一个线程,以便通过并行解压缩QtConcurrent.我的对象new在工作线程内的堆上创建(via ),然后传递回主线程以进行下一步.完成后,将在主线程上删除这些对象.

在单线程环境中,这种释放相对较快(约4-5秒).但是,当在4个线程上进行多线程处理时,这种释放速度非常慢(约26-36秒).使用Very Sleepy进行分析表明减速是在MSVCR100中free,因此释放本身就很慢.

搜索SO表明在不同线程上分配和解除分配是安全的.减速的来源是什么,我该怎么办呢?

编辑:一些示例代码传达了正在发生的事情: 为了排除故障,我已经从这个示例中完全删除了磁盘IO,只需创建对象然后删除它们.

class MyObject
{
public:
    MyObject() { /* set defaults... irrelevant here */}
    ~MyObject() {}
    QMap<quint32, QVariant> map;
    //...other members
}

//...

QList<MyObject*> results;

/* set up the mapped lambda functor (QtConcurrent reqs std::function if returning) */
std::function<QList<MyObject*>(quint64 chunksize)>
        importMap = [](quint64 chunksize) -> QList<MyObject*>
{
    QList<MyObject*> objs;
    for(int i = 0; i < chunksize; …
Run Code Online (Sandbox Code Playgroud)

c++ qt multithreading memory-management

6
推荐指数
2
解决办法
836
查看次数

如何使用 QTextStream 优化 ASCII 输出

我目前正在将数十亿条二进制记录写入 ASCII 文件(呃)。我已经一切正常,但如果可以的话,我想优化性能。问题是,用户可以选择任意数量的字段进行输出,因此我无法在编译时知道它们将包含 3-12 个字段中的哪一个。

有没有更快的方法来构造 ASCII 文本行?如您所见,字段的类型差异很大,我想不出解决一系列 if() 语句的方法。输出 ASCII 文件每条记录有一行,因此我尝试使用由arg 构造的模板QString,但这只会使速度减慢约 15%。

更快的解决方案不必使用 QTextStream,也不必直接写入文件,但输出太大而无法将整个内容写入内存。

这是一些示例代码:

QFile outfile(outpath);
if(!outfile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
{
    qWarning("Could not open ASCII for writing!");
    return false;
} else
{
    /* compute XYZ precision */
    int prec[3] = {0, 0, 0}; //these non-zero values are determined programmatically

    /* set up the writer */
    QTextStream out(&outfile);
    out.setRealNumberNotation(QTextStream::FixedNotation);
    out.setRealNumberPrecision(3);
    QString del(config.delimiter); //the user chooses the delimiter character (comma, tab, etc) - using QChar is …
Run Code Online (Sandbox Code Playgroud)

optimization qt qt4

5
推荐指数
1
解决办法
3048
查看次数

在Qt Creator中禁用项目范围内的编译器警告(使用MSVC时)

我想禁用特定的警告,例如C++ warning C4018: '<' : signed/unsigned mismatch,但是在整个项目范围内.我需要在.pro文件中放置什么来实现这种效果?

c++ qt warnings qt-creator visual-c++

5
推荐指数
1
解决办法
2546
查看次数

什么是QList的最大尺寸?

有没有人遇到过QList的最大尺寸?

我有一个指向我的对象的指针的QList,并且发现当它到达268,435,455项(它正好是28位)时它会默默地抛出一个错误.我原以为它至少有一个31位的最大大小(减去一位因为size()返回有符号整数),或者我的64位计算机上最大大小为63位,但事实并非如此.我通过QList<void*> mylist; mylist.append(0);在计数循环中执行来在最小的例子中证实了这一点.

要重申这个问题,QList的实际最大大小是多少?如果它实际上不是2 ^ 32-1那么为什么呢?有解决方法吗?

我正在为MSVC2010运行Qt 4.8.5的Windows 64位版本.

c++ qt qt4 qlist qtcore

5
推荐指数
1
解决办法
2750
查看次数

为什么将const引用返回给小类成员?

我觉得这个问题肯定是在某个地方,但我要么找不到正确的搜索条件,要么就是错过了.

假设我有类保护其成员,如此...

class MyClass {
   int m_value;
public:
   MyClass(int v) : m_value(v) {}
   int value() const { return m_value; }
}
Run Code Online (Sandbox Code Playgroud)

我已经看到了遍及SO的示例代码,而是返回对成员变量的const引用,如此...

class MyClass {
   int m_value;
public:
   MyClass(int v) : m_value(v) {}
   const int& value() const { return m_value; }
// ^^^^^^^^^^
}
Run Code Online (Sandbox Code Playgroud)

我理解一般返回const的值,以及返回复合对象引用的值,但是对象的值小于体系结构的指针大小?它似乎效率低,安全性差,没有我能想到的优势.


我想在我的例子中可以对构造函数进行类似的讨论,但是这个问题主要关注返回值.

这是SO答案促使我提出这个问题.

c++ reference class

5
推荐指数
1
解决办法
161
查看次数

FindFirstFile的预期输入类型是什么?

我首先要说的是我基本上不了解宽字符串和Unicode支持.我让QString和QFile在99%的时间内为我处理这个问题,但我正在尝试编译为VC6编写的其他人的库.

当我在Qt Creator中使用MSVC2010进行编译时,出现此错误:

error: C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Run Code Online (Sandbox Code Playgroud)

代码正在使用FindFirstFile函数,该函数是重载的(取决于您是否使用Unicode字符集进行编译).FindFirstFile当FindFirstFileA和FindFirstFileW的输入似乎是两种完全不同的类型时,我不明白期望什么类型.

所以这是我的问题:预期的输入类型是FindFirstFile什么?

推论:我如何获取类型的文件名const char*并将其放入FindFirstType将接受的表单中?

c++ unicode qt visual-studio-2010

3
推荐指数
1
解决办法
3523
查看次数