着名的Fisher-Yates shuffle算法可用于随机置换长度为N的阵列A:
For k = 1 to N
Pick a random integer j from k to N
Swap A[k] and A[j]
Run Code Online (Sandbox Code Playgroud)
我一遍又一遍地告诉我的一个常见错误是:
For k = 1 to N
Pick a random integer j from 1 to N
Swap A[k] and A[j]
Run Code Online (Sandbox Code Playgroud)
也就是说,不是从k到N选择一个随机整数,而是从1到N中选择一个随机整数.
如果你犯了这个错误怎么办?我知道由此产生的排列不是均匀分布的,但我不知道对于最终的分布有什么保证.特别是,有没有人有关于元素最终位置的概率分布的表达式?
在C中,NULL定义为(void *)0在C++中它是0.为什么会这样?在CI中可以理解,如果NULL不是类型转换,(void *)则编译器可能/可能不会生成警告.除此之外,有什么理由吗?
volatile是告诉编译器不要优化引用,这样每次读/写都不会使用存储在寄存器中的值,而是进行实际的内存访问.我可以理解它对一些普通变量有用,但不明白如何volatile影响指针.
volatile int *p = some_addr;
int a = *p; // CPU always has to load the address, then does a memory access anyway, right?
Run Code Online (Sandbox Code Playgroud)
如果它被宣布为有什么区别int *p = some_addr?
根据Scott Meyers的说法,在他的Effective STL书中 - 第46项.他声称这std::sort比std::qsort内联的事实要快670%.我测试了自己,我看到qsort更快:(!有谁可以帮我解释这个奇怪的行为?
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <cstdio>
const size_t LARGE_SIZE = 100000;
struct rnd {
int operator()() {
return rand() % LARGE_SIZE;
}
};
int comp( const void* a, const void* b ) {
return ( *( int* )a - *( int* )b );
}
int main() {
int ary[LARGE_SIZE];
int ary_copy[LARGE_SIZE];
// generate random data
std::generate( ary, ary + LARGE_SIZE, rnd() );
std::copy( ary, ary …Run Code Online (Sandbox Code Playgroud) 我不明白,在我看来,调用f是完全明确的,但它无法编译expected primary-expression before ‘int’.如果我通过调用注释掉该行f,它编译得很好.
template<typename T>
struct A {
template<typename S>
void f() { }
};
template<typename T>
struct B : A<T> {
void g() {
this->f<int>();
}
};
Run Code Online (Sandbox Code Playgroud) 我如何从一个ArrayList<E>?理想情况下,我希望能够连续调用该take()方法来获取另一个x元素,而无需替换.
如果我在C++中定义一个内部类,它是否自动成为包含它的类的朋友?例如,这是合法的:
class Outer {
public:
class Inner {
public:
void mutateOuter(Outer& o);
};
private:
int value;
};
void Outer::Inner::mutateOuter(Outer& o) {
o.value ++; // Legal? Or not?
}
Run Code Online (Sandbox Code Playgroud)
我问,因为在我试过的一些编译器(VS2003)上,这段代码不起作用,但我至少听说过它在某些编译器上有效.我无法在C++规范中找到关于此的相关部分,如果有人能够引用某些特定内容,那就是说它是合法的还是不合法的.
有许多计算任意n的F(n)的方法,其中许多方法具有很大的运行时和内存使用率.
但是,假设我想问相反的问题:
给定F(n)n> 2,n是什么?
(由于F(1)= F(2)= 1并且没有明确的逆,因此n> 2限制在那里.
解决这个问题最有效的方法是什么?通过枚举斐波纳契数并在达到目标数时停止,可以很容易地在线性时间内完成此操作,但有没有比这更快的方法呢?
编辑:目前,这里发布的最佳解决方案使用O(log n)内存在O(log n)时间内运行,假设数学运算在O(1)中运行并且机器字可以在O(1)空间中保存任何数字.我很好奇是否可以降低内存要求,因为你可以使用O(1)空间计算斐波纳契数.
我在15K LOC C++项目中使用C风格的强制转换,90%的时间用于子类和基类之间的强制转换.
即使我读到使用它们是不好的,并且它们可能导致严重的错误,因为它们不像C++演员那样安全,我仍然觉得使用它们非常精细和舒适.
到目前为止,我没有遇到过我的项目中的一个错误,例如,一个意外错误的C-Style演员 - 真的.
我没有使用它们有两个主要原因:
我的问题:
我使用C++为我提供的所有其他优点,包括虚拟和抽象基类,命名空间,STL等,而不是新的类型转换语法." 你为什么不只是使用C呢? " 这个论点对我来说不起作用.
如何在C中通过引用传递一组结构?
举个例子:
struct Coordinate {
int X;
int Y;
};
SomeMethod(Coordinate *Coordinates[]){
//Do Something with the array
}
int main(){
Coordinate Coordinates[10];
SomeMethod(&Coordinates);
}
Run Code Online (Sandbox Code Playgroud)