std::不带模板的数组迭代器范围
std::array iterator range without template?
使用 C 数组,编写采用任何大小数组的代码相当容易:
void func( T* itBegin, T* itEnd );
void main() {
T arr1[1];
func( std::begin(arr1), std::end(arr1) );
T arr2[2];
func( std::begin(arr2), std::end(arr2) );
}
如何使用 std::arrays 做到这一点?
void func( ??? itBegin, ??? itEnd );
void main() {
std::array<T,1> arr1;
func( std::begin(arr1), std::end(arr1) );
std::array<T,2> arr2;
func( std::begin(arr2), std::end(arr2) );
}
问题是,在MSVC 2010中,std::array<T,N>::iterator
对于不同的N
是不同的。这是 MSVC 2010 中的错误吗?如果不是,这种设计的理由是什么?是的,我可以从 std::array 获取指针并传递它们而不是迭代器,但这不是不必要的丑陋吗?
顺便说一句,boost::array<T,N>::iterator
对所有N
都是一样的.
template <class I>
void func(I begin, I end)
{
for (auto x = begin; x != end; ++x)
something_with(*x);
}
将它们泛型地定义为类型参数,然后像使用指针一样使用它们。 任何行为类似指针的东西都会编译,没有的东西不会编译。
类似指针的东西包括普通指针,以及标准库迭代器,以及定义operator=
、operator*
和operator++
的任何其他东西。
这样做,并且您只会使用来自同一array<N>
的开始/结束迭代器范围的匹配对,那么array<N>::iterator
是否与array<M>::iterator
不同的类型并不重要。
据
我所知,该标准并不要求不同大小的std::array
具有相同类型的迭代器;为std::array<int, 1>
和std::array<int, 2>
使用不同的迭代器类型似乎是合法的(尽管人们可能对实现的质量有一些意见)。
如果这是一个问题,您可以使用 C 样式数组,也可以使用指针:
func( &arr1[0], &arr1[0] + arr1.size() );
这两种解决方案都不理想,但它们是我能提供的最好的。
template <class I>
void func(I begin, I end);
相关文章:
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- 自定义 STL 兼容迭代器,用于迭代 2D 数组类的列
- 在C++中使用 for 循环的数组迭代
- 获取 c++ 中具有恒定长度的数组的迭代器
- 为自定义数组实现迭代器
- 原始数组和 std::array 在 clang++ 和 VC++ 上的不同迭代器行为
- 有没有办法创建一个花哨的迭代器和相应的新数组,以便检查每个索引的索引值的条件?
- C 迭代器范围使用指针到数组
- 是否可以在 C 数组中使用迭代器?
- 为矩阵创建动态数组,以循环迭代器命名
- 使用迭代器将向量复制到数组中
- 数组迭代器不是可取消引用的错误
- 元素级多维数组迭代,与存储顺序无关
- 多维数组迭代效率
- std::不带模板的数组迭代器范围
- 在多线程代码中缓存友好的数组迭代模式
- 用1个循环解释二维数组迭代
- 数组迭代器中的hasNext()方法
- 兼容STL的两个数组迭代器
- 对于循环数组迭代,if循环测试索引是否为真/假,计算结果不正确