问题描述
我想以这样的方式在两个向量上实现迭代:
for (auto& [i,j]: zip(v1,v2))
j = i;
可以轻松实现zip
函数begin
,end
和operator ++
:
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
而不是i
和j
:
for (auto& [i,v2))
*j = *i;
问题是operator *
返回tuple<T1&,T2&>&
,而它应该是T1
和T2
取消引用的结果的元组。有办法解决吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)