Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用C+包装std::迭代器+;_C++_Iterator - Fatal编程技术网

C++ 用C+包装std::迭代器+;

C++ 用C+包装std::迭代器+;,c++,iterator,C++,Iterator,我需要包装一个向量迭代器,但不喜欢从头重写它。因为向量迭代器似乎不是跨平台的,所以我不能对它进行子类化。至少gnu和ibm看起来不同 我想做的是: class MyContainer { vector<double> data; vector<int> indices; iterator begin() { return my_iterator(data, indices.begin()); } iterator

我需要包装一个向量迭代器,但不喜欢从头重写它。因为向量迭代器似乎不是跨平台的,所以我不能对它进行子类化。至少gnu和ibm看起来不同

我想做的是:

class MyContainer {
    vector<double> data;
    vector<int> indices;

    iterator
    begin()
    { return my_iterator(data, indices.begin()); }

    iterator
    end()
    { return my_iterator(data, indices.end()); }
}

MyContainer  cont;
class MyContainer{
矢量数据;
向量指数;
迭代器
开始
{返回我的迭代器(数据,index.begin());}
迭代器
完()
{返回我的迭代器(数据,index.end());}
}
含霉素;
其中,索引向量包含数据向量中的整数位置。数据应该比指数大得多

所以我需要一个迭代器,它可以像普通向量迭代器一样,在任何方向遍历索引,唯一的例外是:当要访问值时,它必须返回数据向量的值。e、 g:

for(MyContainer::iterator it = cont.begin(); it != cont.end(); it++) {
    cout << *it << endl; // values of data should appear here
}
for(MyContainer::iterator it=cont.begin();it!=cont.end();it++){

cout有一个用于定义自定义迭代器的很棒的Boost库。您需要提供一个包含几个方法的类:

i.dereference()  Access the value referred to
i.equal(j)       Compare for equality with j
i.increment()    Advance by one position
i.decrement()    Retreat by one position
i.advance(n)     Advance by n positions
i.distance_to(j) Measure the distance to j
然后你就可以从银行拿到剩下的钱了


祝你好运!

标准C++库中没有任何东西,但你可以做你想做的事。初步的检查表明你需要重写<代码>迭代器适配器::引用引用< />代码>代码>迭代器适配器:等于< /COD> < < /P>
template <typename _Scalar=double,
          typename _Idx=int, 
          typename _Seq=std::vector<_Scalar>, 
          typename _IdxVector=std::vector<_Idx> >
class SelIter 
    : public boost::iterator_adaptor< SelIter<_Scalar, _Idx>, 
                                      typename _IdxVector::iterator, _Scalar > 
{
public:
    typedef boost::iterator_adaptor< SelIter, typename _IdxVector::iterator, _Scalar > Base;

    SelIter(_Seq& scalars, _IdxVector& idxs);
    SelIter(_Seq& scalars, typename _IdxVector::iterator pi);

    typename Base::reference dereference() const;
    bool equal(const SelIter& x) const;
private:
    // ...
}
模板
类选择器
:public boost::迭代器适配器
{
公众:
迭代器适配器Base;
选择器(_Seq和标量,_IdxVector和idxs);
SelIter(_Seq&scalars,typename _IdxVector::iterator pi);
typename Base::reference dereference()常量;
布尔相等(常数选择和x)常数;
私人:
// ...
}
这看起来很像一个“内置”适配器,它是


请参阅代码板上的(从Boost文档中修改)。

如果我理解,您确实有一个双精度向量,索引向量是毫无意义的。或者可能我错了,我对您真正想要实现的目标没有清晰的印象。我有两个向量。一个包含一个大数据集(10k个元素).index将指向数据集中的一个子集。如下所示:index={1,2,5,1000};我想在容器中迭代,就像在索引向量上迭代一样,但返回的值必须取自数据向量。@birryee,我的猜测是
索引
向量中的值实际上是
数据
向量中的索引,他想输出
数据
ve的值迭代器引用的当前索引处的ctor。类似,但
置换迭代器
置换连续的索引范围。OP需要更多的
组合迭代器
(如果存在)所以哲可以跳过一些索引。@outis:我不认为索引的范围必须是连续的。请看页面底部的示例。“索引”是一个
列表
,该列表在示例中仅用连续数字填充,但可以包含任何其他内容。@outis:我创建了一个在代码板上具有非连续索引的示例。请参见我答案中的链接。@Euric:你说得对。我在介绍中偏离了文本。是的,非常感谢。排列迭代器正是w我需要的帽子