gpt4 book ai didi

c++ - C 数组的反向迭代器

转载 作者:行者123 更新时间:2023-12-02 03:15:30 25 4
gpt4 key购买 nike

对于使用 STL 函数遍历 C 数组,std::beginstd::end函数非常方便地相当于 .begin().end() 。然而,没有std::rbeginstd::rend双向 C++ 容器的反向迭代器的等效项。这样的等价物是否存在其他名称,或者很容易制造?我意识到一个困难是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 等函数中——上面的代码片段不会用 std::distance(x,b) 进行编译。 (或者类似的功能,大概)但需要手册(int*)类型转换。

最佳答案

(我正在将评论转化为帮助他人的答案。感谢 chrisStoryTeller 。)

C++14rbegin()rend()就像你所描述的那样。

还有一个adapter class将(正向)迭代器转换为反向迭代器。请注意,forward begin() 迭代器应传递给 make_reverse_iterator 来创建 reverse 迭代器,反之亦然:

    std::vector<int> v{ 1, 3, 10, 8, 22 };

std::copy(
std::make_reverse_iterator(v.end()),
std::make_reverse_iterator(v.begin()),
std::ostream_iterator<int>(std::cout, ", "));

关于c++ - C 数组的反向迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46793622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com