C++ 用C+包装std::迭代器+;
我需要包装一个向量迭代器,但不喜欢从头重写它。因为向量迭代器似乎不是跨平台的,所以我不能对它进行子类化。至少gnu和ibm看起来不同 我想做的是: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
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我需要的帽子