最近有人问我C++标准运算符(例如new,delete,sizeof)和函数(例如tan,free,malloc)之间的区别."标准"是指编译器套件默认提供的,而不是用户定义的.以下是我给出的答案,但似乎都不令人满意.
(1)运营商不需要包含任何标头来使用它:例如,您可以拨打新电话而不包括任何标题.但是,函数(比如free())确实需要包含头文件,强制执行.
(2)运算符在标准头中的某处定义为(即类操作符).功能不是.
你能批评这些答案并让我更好地了解它们之间的区别吗?
我有一个像这样声明的2D数组:
int arr[2][2]={ {1,2},{3,4}};
Run Code Online (Sandbox Code Playgroud)
如果我这样做:
int ** ptr=(int**) arr;
Run Code Online (Sandbox Code Playgroud)
和:
cout<<**ptr;
Run Code Online (Sandbox Code Playgroud)
我收到了分段错误(使用g ++ - 4.0).
为什么这样?不应该打印值1(等于arr[0][0])?
考虑0/1背包问题.标准动态编程算法仅适用于填充背包的容量和权重是整数/有理数.当容量/重量不合理时你会怎么做?
问题在于我们不能像对整数权重一样进行memoize,因为我们可能需要无限权重的无限小数位 - 导致动态编程表的列数无限大.
有没有解决这个问题的标准方法?对此问题的复杂性有何评论?任何启发式?
那些相关的重现如(例如):
f(x)=f(x-sqrt(2))+sqrt(3),otherwise
f(x)=1, for x< sqrt(2)
f(x)=f(x-sqrt(2))+sqrt(3),otherwise
f(x)=1, for x< sqrt(2)
?
或者这里的Pibonacci数问题:http://www.spoj.pl/problems/PIB/?
考虑一个链接列表,其节点是字符,因此列表代表一个字符串.你如何编写一个递归例程来检查字符串是否是回文,以便所述函数在处理字符串中间的字符时开始展开堆栈?
例如,假设我的字符串是"女士".我的递归函数看起来像:
bool isPalin(const node *startnode, const node *currentnode, const node *midpoint, ...);
什么时候currentnode->data == 'd',堆栈必须放松.
我被问到这个问题的面试; 目前我不能想到这个问题有什么用处,除非是一个非常难的谜题.
初步想法:非常明显(如果不优雅)的方式是:
currentnode 是"之前" midpoint ,则将前者手动推入堆栈.这可以通过维持计数器来决定.有更好的想法或新的见解吗?