(警告:我是C++
中的初学者)。
考虑这个简单的例子:
#include <iostream>
#include <random>
#include <algorithm>
using namespace std;
template<class RandomAccessIterator1>
typename std::iterator_traits<RandomAccessIterator1>::value_type
foo(RandomAccessIterator1 firsta,RandomAccessIterator1 lasta,float store[]){
const float x1=*firsta;
int i=0;
for (RandomAccessIterator1 it=firsta;it!=lasta+1;it++){
store[i++]=x1-*it;
}
return(*(firsta+3));
}
int main(){
const int n=*nr;
int i;
float x[n],store[n];
for(i=0;i<n;i++) x[i]=(float)rand()/(float)RAND_MAX;
std::sort(x,x+n);
float a2=(x[1]+x[n-1])*0.5f;
int m0=std::upper_bound(x,x+n,a2)-x;
int m1=m0/2-1;
float var=foo(x,x+m0,store);
for(i=0;i<m0-1;i++) std::cout<< store[i] << std::endl;
}
我的问题是我需要foo
不考虑x[m1]
。简单地“忘记”&#39;那个元素原样。但我真的无法访问真正的foo
本身:所有内容都必须在foo
的输入级别上完成,而不是函数本身。换句话说,我需要以某种方式使firsta,lasta
成为界限
一个RandomAccessIterator
,其中包含[firsta,lasta)
范围内的所有元素,但 m1
- 。我没有任何反对使用boost或其他外部的东西
开源库。我唯一的问题是无论解决方案应该是O(1)
。
哦,我甚至不知道是否可能。
我添加了标记boost
,因为在SO上似乎有series相关问题可以使用boost
解决此问题。
答案 0 :(得分:1)
如果你不能在foo中做任何事情,只能真正让你选择将除第m1值之外的所有内容复制到一个向量(或其他一些随机访问容器)中。
答案 1 :(得分:1)
您可以创建一个新的迭代器类,它知道要跳过的值。看起来像这样的东西:
class MyIterator
{
public:
MyIterator(containerClass & myContainer, value_type valueToSkip);
private:
containerClass::iterator baseIterator;
value_type skipValue;
};
显然我遗漏了很多细节。