小编Jar*_*d42的帖子

使用<random>在C++中的随机数顺序

我有以下代码,我写的是为了测试更大程序的一部分:

#include <fstream>
#include <random>
#include <iostream>
using namespace std ;

int main()
{
  mt19937_64 Generator(12187) ;
  mt19937_64 Generator2(12187) ;
  uniform_int_distribution<int> D1(1,6) ;

  cout << D1(Generator) << " " ;
  cout << D1(Generator) << " " << D1(Generator) << endl ;
  cout << D1(Generator2) << " " << D1(Generator2) << " " << D1(Generator2) << endl ;

  ofstream g1("g1.dat") ;
  g1 << Generator ;
  g1.close() ;
  ofstream g2("g2.dat") ;
  g2 << Generator2 ;
  g2.close() ;
}                                                            
Run Code Online (Sandbox Code Playgroud)

这两个生成器的种子具有相同的值,因此我预计输出中的第二行与第一行相同.相反,输出是

1 1 3 …
Run Code Online (Sandbox Code Playgroud)

c++ random operator-precedence c++11

39
推荐指数
3
解决办法
2498
查看次数

为什么const auto&p {nullptr}工作而auto*p {nullptr}不能在C++ 17中工作?

这个定义有效:

const auto &b{nullptr};
Run Code Online (Sandbox Code Playgroud)

虽然失败了:

auto *b{nullptr};
Run Code Online (Sandbox Code Playgroud)

我试图在Visual C++,GCC和Clang中编译它.他们都抱怨"不能推断出类型".

在第二种情况下,不b应该推断出有某种类型的std::nullptr_t

c++ nullptr auto c++17

31
推荐指数
3
解决办法
2105
查看次数

什么是班级的VTT?

最近遇到了一个对我来说很新的C++链接器错误.

libfoo.so: undefined reference to `VTT for Foo'
libfoo.so: undefined reference to `vtable for Foo'
Run Code Online (Sandbox Code Playgroud)

我认识到这个错误并解决了我的问题,但我还有一个唠叨的问题:什么是VTT?

旁白:对于那些感兴趣的人,当您忘记定义类中声明的第一个虚函数时,会出现问题.vtable进入类的第一个虚函数的编译单元.如果你忘了定义那个函数,你会得到一个链接器错误,它无法找到vtable而不是更加开发人员友好的找不到该函数.

c++ gcc virtual-inheritance vtable vtt

29
推荐指数
2
解决办法
1万
查看次数

如何检测方法是否是虚拟的?

我试图找出一个方法来查找方法是否是virtual:(https://ideone.com/9pfaCZ)

// Several structs which should fail depending if T::f is virtual or not.
template <typename T> struct Dvf : T { void f() final; };
template <typename T> struct Dvo : T { void f() override; };
template <typename T> struct Dnv : T { void f() = delete; };

template <typename U>
class has_virtual_f
{
private:
    template <std::size_t N> struct helper {};
    template <typename T>
    static std::uint8_t check(helper<sizeof(Dvf<T>)>*);
    template<typename T> static std::uint16_t check(...);
public: …
Run Code Online (Sandbox Code Playgroud)

c++ virtual-functions sfinae type-traits c++11

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

这是计算nCr的更好方法

方法1:
C(n,r)= n!/(nr)!r!

方法2:
wilf的" 组合算法 "一书中,我发现:
C(n,r)可以写成C(n-1,r) + C(n-1,r-1).

例如

C(7,4) = C(6,4) + C(6,3) 
       = C(5,4) + C(5,3) + C(5,3) + C(5,2)
       .   .
       .   .
       .   .
       .   .
       After solving
       = C(4,4) + C(4,1) + 3*C(3,3) + 3*C(3,1) + 6*C(2,1) + 6*C(2,2)
Run Code Online (Sandbox Code Playgroud)

如您所见,最终解决方案不需要任何乘法.在每种形式C(n,r)中,n == r或r == 1.

这是我实现的示例代码:

int foo(int n,int r)
{
     if(n==r) return 1;
     if(r==1) return n;
     return foo(n-1,r) + foo(n-1,r-1);
}
Run Code Online (Sandbox Code Playgroud)

请参见此处的输出

在方法2中,存在重叠的子问题,我们正在调用递归来再次解决相同的子问题.我们可以通过使用动态编程来避免它.

我想知道哪个是计算C(n,r)的更好方法?

c algorithm performance mathematical-optimization binomial-coefficients

28
推荐指数
3
解决办法
4万
查看次数

CMake和MsVS-NuGet

我目前正在开发一个桌面应用程序,使用C++ REST SDK(代号为Casablanca),Qt5和其他一些库.

对于项目设置,我使用CMake.

如何让CMake安装NuGet包?

我现在必须每次手动安装它,如果我重新运行CMake,这不是一个真正的选择.

c++ cmake nuget-package visual-studio-2012

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

如果禁用例外,所有功能都是"noexcept"吗?

如果你通过编译来关闭异常-fno-exceptions所有被认为是noexcept的函数,例如by std::move_if_noexcept或者你是否仍然必须声明函数noexcept?

c++ gcc language-lawyer c++11

25
推荐指数
1
解决办法
1543
查看次数

用常量值初始化std :: array

我需要std::array使用常量值初始化a的所有元素,就像可以使用来完成一样std::vector

#include <vector>
#include <array>

int main()
{
  std::vector<int> v(10, 7);    // OK
  std::array<int, 10> a(7);     // does not compile, pretty frustrating
}
Run Code Online (Sandbox Code Playgroud)

有没有办法优雅地做到这一点?

现在我正在使用这个:

std::array<int, 10> a;
for (auto & v : a)
  v = 7;
Run Code Online (Sandbox Code Playgroud)

但我想避免使用显式代码进行初始化。

c++ initialization stdarray

23
推荐指数
4
解决办法
1382
查看次数

奇怪的是相互重复的类定义

我希望两个类中的类型声明相互依赖.这是第一个用clang和gcc编译的例子:

template <class Sum>
struct A
{
    using X = char;                // (1)
    using Z = typename Sum::B::Y;  // (2)
};

template <class Sum>
struct B
{
    using Y = typename Sum::A::X;
};

struct AplusB
{
    using A = ::A<AplusB>;
    using B = ::B<AplusB>;
};

AplusB::A::Z z;

int main() {}
Run Code Online (Sandbox Code Playgroud)

然而,有一个有趣的时刻.如果你交换行(1)和(2),那么它将无法编译并出现错误:

错误:'A'中没有名为'X'的类型

这让我怀疑原始代码在C++标准意义上是否真的有效,或者它恰好编译?

这是第二个例子,它也利用了模板实例化的顺序:

template <class Sum>
struct A
{
    using X = char;
    using P = typename Sum::B::Q;
};

template <class Sum>
struct B
{
    using Y = typename …
Run Code Online (Sandbox Code Playgroud)

c++ templates language-lawyer template-meta-programming

21
推荐指数
1
解决办法
574
查看次数

constexpr是编译器的"提示"(如内联)还是"绑定请求"?

constexpr编译器的指标还是强制执行行为?

手头的例子如下:

template<typename T> 
std::size_t constexpr getID() { return typeid(T).hash_code(); }
Run Code Online (Sandbox Code Playgroud)

hash_code是一个运行时常量,但即使请求编译时评估,此片段也会编译constexpr.只有在期望编译时常量的返回值之后,才会注意到这不能用作constexpr函数.

那么是constexpr一个"提示"(很像inline关键字)或编译器的"绑定请求"?

c++ constexpr c++11

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