私は、標準アルゴリズムの不器用な独自のバージョンを再実装することを避けようとしているため、標準ライブラリ バージョンで遊んでいます。私は 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 への 2 つのポインターの差が int になるのはなぜですか? (
???
コメントの行で) 型変換のオーバーヘッドはどのくらいですか? ---この種の機能は、計算時間の 90% 以上を占めるコードの一部に配置されるため、効率に関心があります。