【发布时间】:2017-10-17 15:18:40
【问题描述】:
对于使用 STL 函数遍历 C 数组,std::begin 和 std::end 函数非常方便地等效于 .begin() 和 .end()。但是,对于双向 C++ 容器,没有 std::rbegin 和 std::rend 等效的反向迭代器。这样的等价物是否以其他名称存在,还是很容易制作?我意识到一个困难是std::begin 通常返回一个原始指针,而对于相反的情况,这将需要一个包装器,以便可以重载 ++ 操作。一个非常不完整的实现可能看起来像
template<class T>
class ReverseArrayIterator {
public:
ReverseArrayIterator(T* ptr) : _ptr(ptr) {}
operator T*() {
return _ptr;
}
void operator++() {
--_ptr;
}
T operator*() {
return *_ptr;
}
bool operator!= (ReverseArrayIterator& rhs) {
return _ptr != rhs._ptr;
}
private:
T* _ptr;
};
template<class T, size_t size>
ReverseArrayIterator<T> rbegin(T (&array)[size]) {
return ReverseArrayIterator<T>(&array[0] + size - 1);
}
template<class T, size_t size>
ReverseArrayIterator<T> rend(T (&array)[size]) {
return ReverseArrayIterator<T>(&array[0] - 1);
}
我用以下代码测试了这个简单的实现:
int x[] = {1,2,3,4,5,6,0,0,0,10,11,12};
auto a = std::find(std::begin(x),std::end(x),0);
auto b = std::find(rbegin(x),rend(x),0);
cout << std::distance(x,a) << endl;
cout << std::distance(x,(int*)b) << endl;
能否将其充实为 C 数组的完全可操作的反向迭代器类,或者我会遇到更多障碍?一个可能的障碍似乎是隐式转换为原始指针,我希望将其用于 std::distance 之类的函数中——上面的 sn-p 不会与 std::distance(x,b) (或类似的函数,大概)一起编译,但是需要手册(int*)演员。
【问题讨论】:
-
@chris 啊,谢谢;不知何故,我没有通过谷歌找到...
-
@StoryTeller:IMO 最好建议只使用跨度而不是为此使用单独的迭代器适配器。