Iterator为向量的子集

Kai*_*aan 11 c++ vector range c++11

是否有可能从一个向量中获取一个const迭代器,该向量只能在无效之前迭代某个向量范围?

例如,如果我有一个10个元素的向量,我想返回元素4到7的迭代器.

伪代码:

int main()
{
    std::vector<int> vector = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    auto iterator = GetRangedIterator(vector, 4, 7)
    for (const int& num : iterator)
        print num;      // 4, 5, 6, 7
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 15

这非常简单(尽管我将结果称为范围,而不是迭代器).

一个简单的实现看起来像这样:

template <class Iter>
class range {
    Iter b;
    Iter e;
public:

    range(Iter b, Iter e) : b(b), e(e) {}

    Iter begin() { return b; }
    Iter end() { return e; }
};

template <class Container>
range<typename Container::iterator> 
make_range(Container& c, size_t b, size_t e) {
    return range<typename Container::iterator> (c.begin()+b, c.begin()+e);
}
Run Code Online (Sandbox Code Playgroud)

就目前而言,这遵循正常的C++约定(基于0的计数,您指定的结束超出范围的结尾,而不是它),因此要获得您要求的输出,您需要指定范围3, 7,喜欢:

for (int num : make_range(vector, 3, 7))
    std::cout << num << ", ";      // 4, 5, 6, 7,
Run Code Online (Sandbox Code Playgroud)

请注意,基于范围的for循环知道如何使用beginend成员函数来告诉它要迭代的范围,因此我们不必处理使迭代器无效或类似的事情,我们只需指定开头和结尾我们关心的范围.

  • @RemyLebeau:幸运的是,`begin()+ x`不会为`std :: list`或任何其他没有随机访问迭代器的容器编译. (3认同)

Tem*_*Rex 5

您可以使用range-v3库,该库是Ranges TS的基础,它将作为C ++ 20的一部分,但是该库已经可以与C ++ 11编译器一起使用。这是如何做:

#include <range/v3/all.hpp>
#include <iostream>
#include <vector>

int main() 
{
    using namespace ranges;

    auto v = view::iota(1, 11) | to_<std::vector<int>>();
    std::cout << view::all(v)  << '\n';

    auto rng = v | view::slice(3, 7); 
    std::cout << rng << '\n';
}
Run Code Online (Sandbox Code Playgroud)

现场例子