如何实现zip或合并功能来迭代C ++中的两个容器?

问题描述

我想以这样的方式在两个向量上实现迭代:

for (auto& [i,j]: zip(v1,v2))
    j = i;

可以轻松实现zip函数beginendoperator ++

template <class T1,class T2> inline tuple<T1&,T2&> zip (T1& t1,T2& t2) {return {t1,t2}; }

template <class T1,class T2> auto begin (tuple<T1,T2>& t)
{
    tuple r = {get<0>(t).begin(),get<1>(t).begin()};
    return r;
}

template <class T1,class T2> auto end (tuple<T1,T2>& t)
{
    tuple r = {get<0>(t).end(),get<1>(t).end()};
    return r;
}

template <class T1,class T2> tuple<T1,T2>& operator ++ (tuple<T1,T2>& t)
{
    ++get<0>(t);
    ++get<1>(t);
    return t;
}

但是问题出在operator *中,因为它应该返回一个引用。天真的实现失败:

template <class T1,class T2> auto& operator * (tuple<T1,T2>& t)
{
    tuple r = {*get<0>(t),*get<1>(t) }
    return r;  // return reference to local
}

Boost以某种方式实现了类似的功能,但我不想在项目中依靠Boost。我可以用这种方式实现operator *还是应该采用完全不同的方式?

UPD。感谢@SamVarshavchik和@IgorTandetni的评论,我修复了zip并实现了组合迭代器

template <class T1,class T2> class iterator2
{
public:
    iterator2 (T1 _i1,T2 _i2): i1(_i1),i2(_i2),i({i1,i2}) {}
    tuple<T1&,T2&>& operator * () {return i; }
    const tuple<T1&,T2&>& operator * () const {return i; }
    iterator2& operator ++ () {++i1; ++i2; return *this; }
    bool operator != (const iterator2& t) {return i1 != t.i1; }
private:
    T1 i1;
    T2 i2;
    tuple<T1&,T2&> i;
};

template <class T1,T2>& t)
{
    return iterator2(get<0>(t).begin(),get<1>(t).begin());
}

template <class T1,T2>& t)
{
    return iterator2(get<0>(t).end(),get<1>(t).end());
}

不幸的是,这种方式我必须在循环中使用*i*j而不是ij

for (auto& [i,v2))
    *j = *i;

问题是operator *返回tuple<T1&,T2&>&,而它应该是T1T2取消引用的结果的元组。有办法解决吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)