我试图避免重新实现我自己笨拙的标准算法版本,因此正在使用标准库版本。由于我不是 C++ 专家,因此我谨慎行事并打开了完整的调试选项。
具体来说,我在valarray
容器上使用二进制搜索。以下代码块似乎产生了正确的结果,并且valgrind
没有抱怨。尽管如此,我确实觉得我在一个滑坡上,因为我不确定我正在做的事情是否真的被允许,或者我只是被编译器放过了。
有代表性的一段代码:
#include <iostream>
#include <valarray>
#include <algorithm>
#include <typeinfo>
using namespace std;
int main(){
valarray<double> v(10);
for (int i=0 ; i<10 ; ++i){
v[i]=2. *i ;
cout<<v[i]<<" ";
}
cout << "\n";
double what=17;
double* it=lower_bound(&v[0], &v[10],what) ;
cout<<it-&v[0]<<" "<<typeid(&v[0]).name()<<" ";
cout<<typeid(it).name()<<" "<<typeid(it-&v[0]).name()<<"\n"; // ???
int idx=it-&v[0];
cout<<"v["<<idx<<"]="<<v[idx]<<"\n";
}
问题:
- 我在这里做的事情真的合法吗?
- 为什么两个指向 double 的指针之间的差异变成了 int?(与
???
评论一致) 类型转换的开销是多少?--- 我关心的是效率,因为这种功能将位于代码部分,占用超过 90% 的计算时间。