C++ 创建多维迭代器
我在看: 我看到有一篇关于创建多维C++ 创建多维迭代器,c++,templates,multidimensional-array,casting,C++,Templates,Multidimensional Array,Casting,我在看: 我看到有一篇关于创建多维std::array的帖子,你可以这样做 阵列arr 并使用以下方法对其进行迭代: arr[0][…][n-1] 但是,该代码为您“创建”了std::array。相反,我试图编写类似的代码来包装一个已经存在的数组 你知道我怎样才能做到同样的事情吗?我尝试了以下操作,但出现了大量错误:l #include <iostream> #include <iterator> template<typename T, std::size_t
std::array
的帖子,你可以这样做
阵列arr代码>
并使用以下方法对其进行迭代:
arr[0][…][n-1]
但是,该代码为您“创建”了std::array
。相反,我试图编写类似的代码来包装一个已经存在的数组
你知道我怎样才能做到同样的事情吗?我尝试了以下操作,但出现了大量错误:l
#include <iostream>
#include <iterator>
template<typename T, std::size_t size>
class multi
{
protected:
T ptr;
public:
multi(T ptr) : ptr(ptr) {}
T* begin() {return &ptr[0];}
T* end() {return &ptr[size];}
T& operator [](int I) {return ptr[I];}
const T& operator[](int I) const {return ptr[I];}
};
template <typename T, std::size_t thisSize, std::size_t ... otherSizes>
class multi_iterator : private multi<multi_iterator<T, otherSizes...>, thisSize>
{
private:
using base_iter = multi<multi_iterator<T, otherSizes...>, thisSize>;
public:
multi_iterator(T ptr) : base_iter(ptr) {}
using base_iter::begin;
using base_iter::end;
using base_iter::operator [];
};
template <typename T, std::size_t thisSize>
class multi_iterator<T, thisSize> : private multi<T, thisSize>
{
private:
using base_iter = multi<T, thisSize>;
public:
multi_iterator(T ptr) : base_iter(ptr) {}
using base_iter::begin;
using base_iter::end;
using base_iter::operator [];
};
int main()
{
int arr[4][4] =
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
multi_iterator<int*, 4, 4> iter(&arr[0][0]);
for (auto it : iter)
{
for (auto jt : it)
{
}
}
return 0;
}
#包括
#包括
模板
多类
{
受保护的:
T-ptr;
公众:
多(ptr):ptr(ptr){}
T*begin(){return&ptr[0];}
T*end(){return&ptr[size];}
T&运算符[](int I){return ptr[I];}
常量T&运算符[](int I)常量{return ptr[I];}
};
模板
类多重迭代器:私有多重迭代器
{
私人:
使用基本iter=多;
公众:
多迭代器(ptr):基迭代器(ptr){
使用base_iter::begin;
使用base_iter::end;
使用base_iter::operator[];
};
模板
类多重迭代器:私有多重迭代器
{
私人:
使用基本iter=多;
公众:
多迭代器(ptr):基迭代器(ptr){
使用base_iter::begin;
使用base_iter::end;
使用base_iter::operator[];
};
int main()
{
国际航空公司[4][4]=
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
多迭代器iter(&arr[0][0]);
用于(自动it:iter)
{
用于(自动jt:it)
{
}
}
返回0;
}
错误是:
error: cannot convert 'int**' to 'multi_iterator<int*, 4ull>*' in return
T* end() {return &ptr[size];}
error: cannot convert 'int*' to 'int**' in return
T* end() {return &ptr[size];}
错误:无法将“int**”转换为“multi_iterator*”
T*end(){return&ptr[size];}
错误:无法将“int*”转换为“int**”
T*end(){return&ptr[size];}
等等
有什么想法吗?您当前的问题是模板类的迭代器访问器返回了错误的类型。将“multi”视为一个向量
。在您的代码中,begin()返回一个向量*
,而您想要返回的是int*
。在这种情况下,您希望函数签名是
T** begin();
考虑一个普通的指针数组int*[5]myPointerArray代码>。本例中的“迭代器”是指向元素的指针,该元素是int**