我试图避免重新实现我自己笨拙的版本的标准算法,因此正在玩标准库版本。由于我不是C++的专家,因此我谨慎行事,开启全面的调试选项。使用C++标准库算法与valarray
具体而言,我在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的区别是什么? (符合
???
评论) 类型转换的开销是多少? --- I am与效率有关,因为这种功能将会占用占用90%以上计算时间的代码部分。
我修复了我的答案,不完全错误,我认为它也是完整的。 – Omnifarious 2011-03-09 01:35:49