草庐IT

c++ - 为什么小数点后的数字都是零?

我想执行一些计算,我希望结果正确到小数位,比如12。于是我写了一个样例:#definePI3.1415926535897932384626433832795028841971693993751doubled,k,h;k=999999/(2*PI);h=999999;d=PI*k*k*h;printf("%.12f\n",d);但它给出了输出:79577232813771760.000000000000我什至使用了setprecision(),但答案相同,而不是指数形式。cout打印7.95772328138e+16也用过longdouble,但是没有用。除了将整数部分和小数部分分别存储

c++ - LNK2019案例如何解决?一切似乎都是正确的

这个问题在这里已经有了答案:Separatingclasscodeintoaheaderandcppfile(8个答案)关闭5年前。我有那个常见的LNK2019错误,无法找出问题所在。这是我的解决方案资源管理器:这是我的Rectangle.cpp:classRectangle{public:intgetArea(){returnthis->width*this->height;}intwidth;intheight;};这是我的Rectangle.h:#pragmaonceclassRectangle{public:intgetArea();intwidth;intheight;};这

c++ - 即使一切看起来都是 "good", std::mutex::lock 也会抛出吗?

来自CPPReference,没有明确说明如果锁定不会导致死锁,则std::mutex的锁定函数不会抛出。PThread'slock只有死锁错误。我不知道窗口对线程的实现。我也不知道它们是否是用作std::thread/std::mutex后端的线程的其他实现。所以我的问题是“我是否应该编写我的代码,就好像有时候,由于没有特殊原因,锁定可能会失败?”。我实际上需要在某些noexcept方法中锁定一个互斥量,并且我想确保它们是noexcept。 最佳答案 std::mutex::lock()成员函数未声明为noexcept并且来自30

c++ - 标准是否保证 uint8_t、int8_t 和 char 都是唯一类型?

似乎以下内容可以保证通过(已询问here):#includestatic_assert(!std::is_same_v);static_assert(!std::is_same_v);引用cppreference[char]hasthesamerepresentationandalignmentaseithersignedcharorunsignedchar,butisalwaysadistincttype是否也保证int8_t和uint8_t根据显式签名类型定义未定义就char而言,因此也形成一组具有char?的3种不同类型#include#includestatic_assert(

c++ - std::vector 中的每个元素访问都是缓存未命中吗?

众所周知,std::vector将其数据保存在堆上,因此vector本身的实例和第一个元素具有不同的地址。另一方面,std::array是原始数组的轻量级包装器,其地址等于第一个元素的地址。让我们假设集合的大小足以容纳int32的一个缓存行。在我有384kBL1缓存的机器上它是98304个数字。如果我迭代std::vector,我总是首先访问vector本身的地址,然后访问下一个元素的地址。并且可能这个地址不在同一个缓存行中。所以每次元素访问都是缓存未命中。但如果我迭代std::array地址在同一个缓存行中,那么它应该更快。我用VS2013进行了全面优化测试,std::array快了

c++ - 为什么 GLM 构造函数都是显式的?

我已经开始在我的代码中使用GLM库。看起来不错,但我不能做这样的事情:voidfoo(constglm::vec3&arg);foo({x,y,z});因为构造函数都是显式的。这开始让我烦透了。我想不出一个很好的理由来禁止隐式构造这种简单的值类型。作者是盲目地遵循了一些无关紧要的格言,还是他们知道一些我不知道的事情? 最佳答案 在最新版本中,他添加了C++11;在README中查看0.9.5.0的更改https://github.com/g-truc/glm在g-truc下载http://glm.g-truc.net/我刚刚将它放入

c++ - 在方阵中,每个单元格都是黑色或白色。设计一个算法来找到最大子正方形,使得所有 4 个边框都是黑色

给定一个方阵,其中每个单元格都是黑色或白色。设计一个算法来找到最大的子正方形,使得所有4个边框都是黑色的。我有O(n^2)算法:从左到右扫描每一列,对于每一列中的每个单元格,扫描每一行以找到具有后边框的最大子方block。有更好的解决方案吗?谢谢 最佳答案 O(n^2)是可能的。我猜这是最佳选择,因为您有n^2个单元格。请注意,任何正方形的左上角和右下角都位于同一条对角线上。现在如果我们可以在O(n)时间内处理每条对角线,我们就会有一个O(n^2)时间算法。假设我们有一个左上角的候选。我们可以计算它下方和右侧的连续黑色单元格的数量,

c++ - std::find 和 std::map.find 都是 O(logN) 吗?

std::find和std::map.find都是O(logN)吗?如果是,std::find如何在对数时间内实现对std::map的搜索?std::find的实现是否专门用于std::map用例? 最佳答案 不,std::find是O(N),与容器无关。它不知道“容器”,没有针对std::map的专门化。std::find仅使用迭代器,它没有关于底层容器的信息。根据cppreference.com,实现等同于:templateInputItfind(InputItfirst,InputItlast,constT&value){fo

c++ - 所有 std::tuple 构造函数都是必需的吗?

std::tuple包含以下构造函数:explicittuple(constTypes&...args);templateexplicittuple(UTypes&&...args);两者都有相同的描述,因为它们使用args中的相应值初始化每个元素。唯一的区别是在第二个参数被转发。根据我对右值引用的了解,我不明白为什么需要第一个版本,因为可以将相同的参数传递到第二个版本。引用将被转发,没有人会更聪明,特别是因为没有提到移动语义。谁能解释是什么让这两个构造函数成为必需? 最佳答案 这是一个简化的例子:templatestructfoo

c++ - 所有 CopyConstructible 类型都是 MoveConstructible 类型吗?

根据工作草案N3337(与已发布的ISOC++11标准最相似的草案)和cppreference.com,答案是肯定的。N3337:Table21—CopyConstructiblerequirements(inadditiontoMoveConstructible)[copyconstructible][...]cppreference.com:ThetypeTsatisfiesCopyConstructibleifThetypeTsatisfiesMoveConstructible,and[...]但是根据在Ubuntu14.04.3LTS中用gcc(Ubuntu4.8.4-2ubu