我构建了一个函数,将单个偏移数偏移量展开到索引数组 rindex 。我使用它来获得更高维网格的相应索引。不可否认,这个函数看起来有点古怪的是它的reverse_iterators,但它有效,我现在不知道怎么做不同。
现在,一旦我使 bounds 变量const-qualified,我得到一个关于reverse_iterators的非常神秘的编译时错误。有人可以帮我一点吗?
#include <array>
#include <iostream>
template <typename size_type, typename crIt, typename rIt>
constexpr size_type unpeel(size_type offset, const crIt rbegin, const crIt rend,
rIt rindex) {
for (rIt rit = rbegin; rit != rend; rit++) {
*rindex++ = offset % *rit;
offset /= *rit;
}
return offset;
}
int main() {
size_t count = 0;
constexpr size_t N = 2;
const std::array<size_t, N> bounds{{2, 3}};
std::array<size_t, N> index{};
unpeel(0, bounds.rbegin(), bounds.rend(), index.rbegin());
}
这里有错误的示例: https://ideone.com/nSLPaw
答案 0 :(得分:1)
迭代器rbegin
不能分配给rit
- 您需要将其声明为常量迭代器(或简称为auto
):
for (auto rit = rbegin; rit != rend; rit++)
既然你正在经过价值,你可以简单地
while (rbegin != rend) {
*rindex++ = offset % *rbegin;
offset /= *rbegin++;
}
完整,成功编译,代码:
template <typename size_type, typename InputIterator, typename OutputIterator>
constexpr size_type unpeel(size_type offset,
InputIterator rbegin,
InputIterator rend,
OutputIterator rindex)
{
for (; rbegin != rend; ++rbegin) {
*rindex++ = offset % *rbegin;
offset /= *rbegin;
}
return offset;
}
#include <array>
#include <iostream>
int main() {
constexpr size_t N = 2;
const std::array<size_t, N> bounds{{2, 3}};
std::array<size_t, N> index{};
unpeel(0, bounds.rbegin(), bounds.rend(), index.rbegin());
}
我已经使用传统的类型名称作为迭代器模板类型,以使要求更加清晰。