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循环知道如何使用begin和end成员函数来告诉它要迭代的范围,因此我们不必处理使迭代器无效或类似的事情,我们只需指定开头和结尾我们关心的范围.
您可以使用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)
现场例子。
| 归档时间: |
|
| 查看次数: |
3935 次 |
| 最近记录: |