我有以下代码,我写的是为了测试更大程序的一部分:
#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) 这个定义有效:
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++链接器错误.
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而不是更加开发人员友好的找不到该函数.
我试图找出一个方法来查找方法是否是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) 方法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
我目前正在开发一个桌面应用程序,使用C++ REST SDK(代号为Casablanca),Qt5和其他一些库.
对于项目设置,我使用CMake.
如何让CMake安装NuGet包?
我现在必须每次手动安装它,如果我重新运行CMake,这不是一个真正的选择.
如果你通过编译来关闭异常-fno-exceptions
所有被认为是noexcept的函数,例如by std::move_if_noexcept
或者你是否仍然必须声明函数noexcept?
我需要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)
但我想避免使用显式代码进行初始化。
我希望两个类中的类型声明相互依赖.这是第一个用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) 是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
关键字)或编译器的"绑定请求"?