使用带有valarray的c ++标准库算法

我试图避免重新实现我自己的标准算法的笨拙版本,因此我正在使用标准库版本。由于我不是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";
}
问题: 我在这里做的真的合法吗? 为什么两个指针之间的区别变成了一个int? (符合
???
评论) 类型转换的开销是多少? ---我关注效率,因为这种功能将占据代码的一部分,占用了90%以上的计算时间。     
已邀请:
你使用
int
来索引
valarray
。这对于这个例子是有效的,但不是一般的。使用
std::size_t
索引到
valarray
。 (对于
std::vector
和普通数组也是如此。) 两个指向任何类型的指针之间的区别是一个未指定的整数类型,可能是
int
long
,并且总是小到足以适合
std::ptrdiff_t
。 哪个转换?     
我相信这是所有已定义的行为,将继续适用于任何实现。看看valarray的各种文档,看起来它必须是合法的才能使所有其他关于
::std::valarray
的事情成立。在调用
resize
成员函数或
valarray
被破坏之前,指向元素的裸指针应保持完全有效。 唯一真正的问题是,是否需要
valarray
来连续保持其元素。我在帖子中找到了这个问题的答案。我会在这里摘录它:   是的,valarray也使用连续的   存储。具体措辞来自   标准是($ 26.3.2.3 / 3):   表达&amp; a [i + j] ==&amp; a [i] + j   对于所有size_t我评估为真   size_t j使得i + j小于   非常数数组的长度   一个。 当然,切片仍然不能直接与标准算法一起使用,尽管创建切片迭代器不应该太难。制作双向的很容易,但是要创建一个随机访问迭代器要困难得多(要完全正确地进行大量的数学操作)。 两个指针之间的差异变成(正如别人所说)
::std::ptrdiff_t
。这将是不同平台上的不同类型。我在64位Fedora 14下使用gcc,对我来说类型是
long
。这种'类型转换'没有开销。它甚至不是转换。编译器只进行减法,好像两个指针是普通的旧数字,结果是某个类型的普通旧数字。对类型使用
::std::ptrdiff_t
是为了确保所使用的数字类型足以保持系统中任何两个指针之间的差异。     

bab

这些
it-&v[0]
真的吓到我..你的意思是
it->v[0]
? lower_bound的返回值是
valarray<double>::iterator
,请使用而不是
double*
!所有其他derefencing问题将自动消失。例如,你可以做
*it
it++
但你不能做
it->v[0]
,因为它不是指针而是迭代器。它很可能是一个
v.end()
-迭代器,使你的所有人都认为它的价值是非法的。 有关迭代器的更多信息:http://www.cppreference.com/wiki/iterator/start 编辑:哦,现在我明白了,你正在使用可怕的指针算术!那就是C,我们不再那样了;)     

要回复问题请先登录注册