我试图避免重新实现我自己笨拙的标准算法版本,因此我正在使用标准库版本。由于我不是 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% 以上计算时间的代码部分。
  • 最佳答案

  • 您正在使用 int 索引到 valarray 。这对这个例子是有效的,但不是一般的。使用 std::size_t 索引到 valarray 。 (std::vector 和普通数组也是如此。)
  • 指向任何类型的两个指针之间的差异是未指定的整数类型,可能是 intlong 并且总是足够小以适合 std::ptrdiff_t
  • 哪个转换?
  • 关于c++ - 使用带有 valarray 的 C++ 标准库算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5240267/

    10-11 22:30
    查看更多