小编Clè*_*lèm的帖子

在某些情况下,std :: is_floating_point为float返回false

在某些情况下,请参见下面一个例子,std::is_floating_point在返回falsefloat.

#include <iostream>
#include <type_traits>
#include <vector>

int main()
{
    ::std::cout << typeid(decltype(::std::vector< float >()[::std::vector< float >().size()])).name() << ::std::endl;
    if (::std::is_floating_point< decltype(::std::vector< float >()[::std::vector< float >().size()]) >::value)
    {
        ::std::cout << "floating point" << ::std::endl;
    }
    else
    {
        ::std::cout << "not floating point" << ::std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

GCC的输出

f
not floating point
Run Code Online (Sandbox Code Playgroud)

在这个例子中,人们可以看到它typeid::std::vector< float >()[::std::vector< float >().size()]视为a float,它返回正确的名称.人们也可以检查typeid(decltype(::std::vector< float >()[::std::vector< float >().size()])) == typeid(flat)退货true.但是, …

c++ floating-point types std typeid

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

如何在C++中构建N位变量?

我正在处理C++中非常大的布尔列表,每个约有2 ^ N个N布尔项.因为内存在这种情况下是关键的,即指数增长,我想构建一个N位长变量来存储每个元素.

对于小N,例如24,我只是使用unsigned long int.需要64MB((2 ^ 24)*32/8/1024/1024).但我需要上升到36.内置的变量是唯一的选择unsigned long long int,但它需要512GB((2 ^ 36)*64/8 /一千○二十四分之一千○二十四/ 1024),这是一个有点过分.使用36位变量,它可以为我工作,因为大小下降到288GB((2 ^ 36)*36/8/1024/1024/1024),这适合我的超级计算机的节点.

我试过std::bitset,但std::bitset< N >创造了至少8B的元素.所以列表std::bitset< 1 >远远大于列表unsigned long int.这是因为std::bitset只是改变了表示,而不是容器.

我也尝试过boost::dynamic_bitset<>Boost,但结果甚至最差(至少32B!),出于同样的原因.

我知道一个选项是将所有元素写为一个布尔链,2473901162496(2 ^ 36*36),然后存储在38654705664(2473901162496/64)unsigned long long int,它给出288GB(38654705664*64/8/1024/1024/1024).然后访问元素只是找到存储36位的元素的游戏(可以是一个或两个).但是现有代码(3000行)的重写很多,因为映射变得不可能,并且因为在某些功能执行期间添加和删除项目肯定会复杂,混乱,具有挑战性,结果很可能效率不高.

如何在C++中构建一个N位变量?

c++ algorithm optimization bitarray bitset

6
推荐指数
1
解决办法
380
查看次数

如果返回类型是C++中的对象,我们可以在函数定义中使用绝对命名空间吗?

让我们考虑一个bar在命名空间foo中声明的函数,它返回一个std::vector< float >(但也适用于其他对象).

// header.h
#include <vector>

namespace foo
{
        ::std::vector< float > bar();
}
Run Code Online (Sandbox Code Playgroud)

使用相对命名空间编译其定义.

#include "header.h"

::std::vector< float > foo::bar()
{
}
Run Code Online (Sandbox Code Playgroud)

但是,使用绝对命名空间编译其定义不起作用.

#include "header.h"

::std::vector< float > ::foo::bar()
{
}
Run Code Online (Sandbox Code Playgroud)

GCC的返回错误是

function.cpp:3:26: error: ‘foo’ in ‘class std::vector<float>’ does not name a type
::std::vector< float > ::foo::bar()
Run Code Online (Sandbox Code Playgroud)

事实证明,在命名空间中允许使用空格,因此,::std::vector< float > ::foo::bar()相当于::std::vector< float >::foo::bar().当返回类型是对象时,如何在函数定义中使用绝对命名空间?

c++ namespaces return declaration object

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