草庐IT

do_some_long_calculation

全部标签

c++ - 如何将 std::wstring 转换为数字类型(int、long、float)?

将std::wstring转换为数字类型(例如int、long、float或double)的最佳方法是什么? 最佳答案 C++0x引入了followingfunctions在:intstoi(constwstring&str,size_t*idx=0,intbase=10);longstol(constwstring&str,size_t*idx=0,intbase=10);unsignedlongstoul(constwstring&str,size_t*idx=0,intbase=10);longlongstoll(constw

c++ - 具有重载的显式模板函数特化 : Why would you do it?

假设如下:templatevoidfoo(T*);//#1templatevoidfoo(T);//#2templatevoidfoo(int*);//#3当引入一个也有重载的基本模板的显式特化时,在设计重载解析期间不考虑特化。我明白这一点。但是,鉴于我可以使#3成为非模板重载,然后它会被考虑用于重载决议,为什么我仍然想像上面那样做呢?上面演示的设置是否有有效的用例?我唯一能想到的是,如果您不依赖模板类型推导,则无法使用非模板函数,因为它们不接受。调用它们时的语法。顺便说一句,我只回顾了C++03的规则。我不确定C++11是否/如何改变这些规则/行为。 最佳

c++ - 屋顶模型 : calculating operational intensity

假设我有一个这样的玩具环floatx[N];floaty[N];for(inti=1;i我假设我的缓存行是64字节(即足够大)。然后我将(每帧)基本上有2次访问RAM和3次FLOP:1(缓存)读取访问:加载所有3个x[i-1]、x[i]、x[i+1]1次写访问:存储y[i]3FLOP(1mul,1add,1sub)操作强度是ergoOI=3FLOP/(2*4BYTE)现在如果我这样做会发生什么floatx[N];for(inti=1;i请注意,不再有y。这是否意味着现在我有一个单一的RAM访问权限1(缓存)读/写:加载x[i-1],x[i],x[i+1],存储x[i]或者还有2次RAM

c++ - do-while 语句主体中的声明范围

在Whycan'tyoudeclareavariableinsideadowhileloop?OP询问为什么do-while循环的while-condition中的声明不在do-statement的范围内。这将是非常不自然的,因为C/C++通常遵循“范围顶部声明”模式。但是反过来呢——为什么不将do语句中的任何声明的范围扩展到while条件。这将允许inti;do{i=get_data();//whateveryouwanttodowithi;}while(i!=0);缩短为do{inti=get_data();//whateveryouwanttodowithi;}while(i!=

c++ - 诸如 `msg(long)` 与候选 `msg(int32_t)` 和 `msg(int64_t)` 等函数的模糊重载

注意:这与Determinenumberofbitsinintegraltypeatcompiletime非常相似,但是这是一个非常简化的版本,所有内容都包含在一个.cpp中编辑:添加了一个解决方案-尽管给出了(并接受)了正确的解释,但我找到了一种通用的解决问题的方法。问题问题在于像这样的函数msg(int32_t);msg(int64_t);像这样的电话longlongmyLong=6;msg(myLong);//Won'tcompileongcc(4.6.3),callisambiguous这在MSVC上编译。谁能解释为什么这在gcc上失败(我假设这可能与gcc通常严格符合标准这一

c++ - 将多边形坐标从 Double 转换为 Long 以用于 Clipper 库

我有两个多边形,它们的顶点存储为Double坐标。我想找到这些多边形的交叉区域,所以我正在查看Clipperlibrary(C++版本)。问题是,Clipper仅适用于整数数学(它使用Long类型)。有没有一种方法可以用相同的比例因子安全地转换我的两个多边形,将它们的坐标转换为Longs,使用Clipper执行相交算法,并使用相同的比例缩小生成的相交多边形,然后将其转换回来到Double而不会损失太多精度?我不太清楚该怎么做。 最佳答案 您可以使用一个简单的乘数在两者之间进行转换:/*Usingpower-of-twobecause

c++ - 从 long 转换的 C++ bitset 构造函数的复杂性是什么?

我的猜测是O(n),其中n是编号。位。或者它是恒定的w.r.t.ñ?我的意思是它不应该只是能够从内存中复制位吗? 最佳答案 从数学上讲,long具有固定长度,因此复制它的内容是常量时间操作。另一方面,您需要将bitset中的其余位归零,并且您无法在相对于bit_set的长度的小于线性时间内完成。所以,理论上你不能比O(n)做得更好,其中n是位集的长度。我想从渐近复杂性的角度来看,您可以安全地假设构造函数的复杂性与将分配的内存清零相同。然而,此分析仅对n的巨大值有一定值(value),使用长构造函数初始化百万位的位集对我来说没有多大意

c++ - 从 long long 到 float 的隐式转换会产生意外结果

试图验证(使用VS2012)一本书的声明(第二句)Whenweassignanintegralvaluetoanobjectoffloating-pointtype,thefractionalpartiszero.Precisionmaybelostiftheintegerhasmorebitsthanthefloating-pointobjectcanaccommodate.我写了下面的小程序:#include#includeusingstd::cout;usingstd::setprecision;intmain(){longlongi=4611686018427387905;//

c++ - 使用 std::prev(vector.begin()) 或 std::next(vector.begin(), -1) 像 some_container.rend() 作为反向哨兵是否安全?

我写了一些采用迭代器但必须以相反顺序进行比较的代码,templateboolfunc(ConstBiIterseq_begin,ConstBiIterseq_end){ConstBiIterlast=std::prev(seq_end);while(--last!=std::prev(seq_begin))//-->Ineedtocomparethebeginningdata{......}returntrue;}在VS2013中,在Debug模式下运行时,--last!=std::prev(seq_begin)将导致调试器断言失败并显示错误消息Expression:stringite

c++ - 为什么 std::size_t 在 32 位系统上是 4 个字节,而 unsigned long long 在 32 位和 64 位系统上都是 8 个字节?

问题很简单。在32位系统上:std::cout在64位系统上:std::cout我只检查了MSVC的实现,它看起来像这样:#ifdef_WIN64typedefunsigned__int64size_t;#elsetypedefunsignedintsize_t;#endif那么为什么不在32位和64位系统上制作std::size_tunsignedlonglong(std::uintmax_t)支持吗?还是我错了? 最佳答案 size_t的要点是能够容纳最大可能对象的大小。在32位系统上,任何对象都不能占用超过2**32字节,因此