也许这是一个重复,但我没有找到任何搜索:当所有元素erase(value)
被调用时,std::multiset
找到的值被删除.我能想到的唯一解决方案是:
std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);
Run Code Online (Sandbox Code Playgroud)
这没关系,但我认为可能会更好.有任何想法吗 ?
我知道该关键字inline
具有有用的属性,例如用于在头文件中保留模板特化.另一方面,我经常读到这inline
几乎没有用作编译器实际内联函数的提示.此外,关键字不能在cpp文件中使用,因为编译器想要inline
在调用时检查用关键字标记的函数.
因此,我对现代编译器的"自动"内联功能(即gcc 4.43)感到有些困惑.当我在cpp中定义一个函数时,编译器是否可以内联它,如果它认为内联对函数有意义,或者我是否剥夺了他的某些优化功能?(这对于大多数功能来说都没问题,但对于经常调用的小功能很重要)
在https://doc-snapshots.qt.io/qtcreator-extending/coding-style.html上,建议编写如下循环:
Container::iterator end = large.end();
for (Container::iterator it = large.begin(); it != end; ++it) {
//...;
}
Run Code Online (Sandbox Code Playgroud)
代替
for (Container::iterator it = large.begin(); it != large.end(); ++it) {
//...;
}
Run Code Online (Sandbox Code Playgroud)
由于我很少在任何代码中看到这种风格,我想知道end()的连续调用是否真的为stl容器上的大型循环添加了明显的运行时开销,或者编译器是否已经优化了这种情况.
编辑:许多非常好的评论指出:这个问题仅在循环内的代码不修改结束迭代器时才有效.否则,当然重复的结束呼叫是强制性的.
这个问题总是让我很烦恼,特别是当我用Qt编程的时候.由于Qt使用对象所有权树,因此传递指针(例如via)myBoostSharedPtr.get()
可以隐式转移所有权.现在考虑一些Qt对象被破坏并且整个对象树被破坏但智能指针仍然存在的情况,例如作为不同类的成员.如果之后智能指针被删除会发生什么?双重删除所有令人讨厌的后果?一些智能指针实现会阻止这种情况吗?
我最近偶然发现了以下gcc 3.2.2编写ac程序的行为:
在if语句中,我忘记了函数的大括号,并写道:
if(myFunc)...
代替 if(myFunc())...
虽然我几乎每个警告都打开了,但这并没有产生错误.
它只是评估为true
.为什么这首写法律代码?因为函数存在/有地址?有谁知道如何避免这样的错误,或者是否有一个我忽略的警告选项?这个问题在以后的gcc版本中是否能更好地解决?
这里是完整性的确切编译器调用:
msp430-gcc -g -Os -mmcu=msp430x1611 -Wall -W -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wwrite-strings -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations
-Wredundant-decls -Wnested-externs -Wimplicit-function-declaration -Werror
Run Code Online (Sandbox Code Playgroud)
(因为我被迫使用gcc 3.2.3,所以没有-Wextra)
我总是假设以下测试将始终成功获得有限值(无INF,无NAN)somefloat
:
assert(somefloat*0.0==0.0);
Run Code Online (Sandbox Code Playgroud)
在Multiply by 0优化中,它表明double a=0.0
并且double a=-0.0
严格来说并不是相同的事情.
所以我想知道这是否会导致某些平台出现问题,例如上述测试的结果是否取决于a
正面还是负面.
我使用qmake作为makefile构建器,并希望坚持下去.此外,我想使用"gcc -Wall -Werror -Wundef -Wextra"来获得健壮的代码.我正在考虑"-pedantic",但这是更进一步的道路.我目前的主要问题是图书馆产生的大量警告,如激励,部分qt等.
每当我包含警告生成标题时,我都会使用编译指示
#pragma GCC diagnostic ignored "-Wall"
#include <QtGui>
...
#include <QWidget>
#pragma GCC diagnostic error "-Wall"
Run Code Online (Sandbox Code Playgroud)
这远非可爱,相当乏味和繁琐,特别是其他程序员也必须这样做.是否有使用qmake的选项允许包含qt-libraries作为系统头,从而压制他们的警告.对于简单的makefile和cmake我知道 - 系统但我找不到这个qmake吊坠.
我使用QGraphicsView/QGraphicsScene在Qt中绘图.只要我不断绘制更大的东西,缩放和适合工作得体.但是,当boundign矩形大小减小时View不会.它只显示相同(或更大的区域).
在我在视图上重新绘制一个较小的场景之前,我调用以下命令:
mpScene->clear();
mpScene->setSceneRect(QRectF());
mpView->setSceneRect(QRectF());
mpView->resetMatrix();
mpView->fitInView(this->sceneRect(),Qt::KeepAspectRatio);
Run Code Online (Sandbox Code Playgroud)
唉,视图显示的画布仍在不断增长.我错过了什么?
场景和视图配置如下(仅为完整性而给出):
mpView->setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate);
mpView->setCacheMode(QGraphicsView::CacheBackground);
mpView->setScene(mpScene);
mpView->setWindowFlags(Qt::FramelessWindowHint);
mpView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
mpView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
mpView->setFrameStyle(QFrame::NoFrame);
mpView->setAutoFillBackground(false);
mpView->setAttribute(Qt::WA_OpaquePaintEvent, true);
mpView->setAttribute(Qt::WA_NoSystemBackground, true);
//enabling OpenGl if possible
QGLFormat fmt = QGLFormat::defaultFormat();
fmt.setSampleBuffers(true);
fmt.setDoubleBuffer(true);
fmt.setSamples(256);
fmt.setDirectRendering(true);
QGLWidget* pGlWidget = new QGLWidget(fmt);
if(pGlWidget->isValid()) mpView->setViewport(pGlWidget);
else delete pGlWidget;
mpView->setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate);
Run Code Online (Sandbox Code Playgroud)
注意:版本是Qt4.8
可能重复:
栅格化2D多边形
我需要栅格包含其内部区域的多边形(确定位于多边形内的网格的所有图块).目前我通过使用一个简单的Bresenham来确定边界区块,但到目前为止我还没有有效的方法来对多边形的"内部"进行栅格化(也可能是凹形的).到目前为止,我的方法是将图块范围限制为包括多边形的矩形,然后使用多边形缠绕算法确定每个图块中心是位于内部还是外部.这样做效率很低,因为它涉及检查每个图块的每个多边形边界线段.从第一个角度来看,肯定应该有一个更快的方法,例如...... 比如使用光栅边界缠绕.是否有一个标准算法可以解决这个问题,甚至可能是C++中的库实现?
boost :: optional <>适用于简单的数据类型,但只要用于从实现接口的类继承的类,它就会在启用严格别名时失败.
例:
#include <boost/optional.hpp>
struct MyLine{
double a;
double b;
};
class Edge{
public:
MyLine toMyLine() const;
private:
virtual MyLine doToMyLine() const =0;
};
class Wall:public Edge {
public:
Wall(MyLine const& seg):mMyLine(seg){};
private:
MyLine doToMyLine() const{return MyLine();};
MyLine mMyLine;
};
class SimpleWall {
public:
SimpleWall(MyLine const& seg):mMyLine(seg){};
private:
MyLine mMyLine;
};
int main(){
//boost::optional<Wall> res; //fails with strict aliasing error
boost::optional<SimpleWall> res2; //compiles just fine
}
Run Code Online (Sandbox Code Playgroud)
使用gcc版本4.4.3编译以下内容时出错:
g++ -c -pipe -Wall -Wextra -Wunused -Wmissing-declarations -Wpointer-arith -Wcast-align -Wwrite-strings …
Run Code Online (Sandbox Code Playgroud)