在c ++中链接非重叠,非连续的迭代器(/ boost)

时间:2014-05-21 14:01:07

标签: c++ boost

(警告:我是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解决此问题。

2 个答案:

答案 0 :(得分:1)

如果你不能在foo中做任何事情,只能真正让你选择将除第m1值之外的所有内容复制到一个向量(或其他一些随机访问容器)中。

答案 1 :(得分:1)

您可以创建一个新的迭代器类,它知道要跳过的值。看起来像这样的东西:

class MyIterator
{
public:
    MyIterator(containerClass & myContainer, value_type valueToSkip);
private:
    containerClass::iterator baseIterator;
    value_type skipValue;
};

显然我遗漏了很多细节。