Far*_*zam 10 c++ gcc for-loop c++11
在c ++ 11中,如果我们有set<int> S
; 我们可以说:
for (auto i: S)
cout << i << endl;
Run Code Online (Sandbox Code Playgroud)
但我们可以强制i
成为迭代器,我的意思是编写一个相当于以下代码的代码:
for (auto i = S.begin(); i != S.end(); i++)
cout << (i != s.begin()) ? " " : "" << *i;
Run Code Online (Sandbox Code Playgroud)
或者我们可以做一些我们可以理解i
集合(或向量)中的索引的东西吗?
另一个问题是我们怎么能说不要对所有元素都这样做,S
但对于前半部分或除了第一部分之外的所有元素.
或者当我们有一个vector<int> V
,并且想要打印它的第一个n
值时我们该怎么做?我知道我们可以创建一个新的向量,但是将一个向量复制到一个新向量需要时间.
Dam*_*mon 20
不,不幸的是.看看标准说的是什么:
(for-range-declaration:expression)语句的基于范围的for语句等效于
Run Code Online (Sandbox Code Playgroud){ auto && __range = ( expression ); for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } }
其中__range,__ begin和__end是仅为展示定义的变量
换句话说,它已经迭代begin
到end
并且已经解引用迭代器,这是你永远不会看到的.
基于范围的原则for
是迭代整个范围.
但是,您可以决定范围是什么,因此您可以对范围本身进行操作.
template <typename It>
class RangeView {
public:
typedef It iterator;
RangeView(): _begin(), _end() {}
RangeView(iterator begin, iterator end): _begin(begin), _end(end) {}
iterator begin() const { return _begin; }
iterator end() const { return _end; }
private:
iterator _begin;
iterator _end;
};
template <typename C>
RangeView<typename C::iterator> rangeView(C& c, size_t begin, size_t end) {
return RangeView<typename C::iterator>(
std::next(c.begin(), begin),
std::next(c.begin(), end)
);
}
template <typename C>
RangeView<typename C::const_iterator> rangeView(C const& c, size_t begin, size_t end) {
return RangeView<typename C::const_iterator>(
std::next(c.begin(), begin),
std::next(c.begin(), end)
);
}
Run Code Online (Sandbox Code Playgroud)
好吧,这严重重新组合了Boost.Range ......
而现在,让我们使用它!
for (auto i: rangeView(set, 1, 10)) {
// iterate through the second to the ninth element
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
21733 次 |
最近记录: |