如何跳过基于范围的 for 循环的第一次迭代?

问题描述 投票:0回答:4

我想做这样的事情:

for (int p : colourPos[i+1])

如何跳过

colourPos
向量的第一次迭代?

我可以使用

.begin()
.end()
吗?

c++ for-loop c++11 vector iteration
4个回答
22
投票

C++20 起,您可以使用 Ranges 库

中的范围适配器 
std::views::drop 以及基于范围的 for 循环来跳过第一个元素,如下所示:

std::vector<int> colourPos { 1, 2, 3 }; for (int p : colourPos | std::views::drop(1)) { std::cout << "Pos = " << p << std::endl; }
输出:

位置 = 2

位置 = 3

Wandbox 上的代码

注意:我不建议使用包含

begin()

 和/或 
end()
 的解决方案,因为基于范围的 for 循环的想法是摆脱迭代器。如果您需要迭代器,那么我会坚持使用基于迭代器的 for 循环。


16
投票

现场演示链接。

#include <iostream> #include <vector> #include <iterator> #include <cstddef> template <typename T> struct skip { T& t; std::size_t n; skip(T& v, std::size_t s) : t(v), n(s) {} auto begin() -> decltype(std::begin(t)) { return std::next(std::begin(t), n); } auto end() -> decltype(std::end(t)) { return std::end(t); } }; int main() { std::vector<int> v{ 1, 2, 3, 4 }; for (auto p : skip<decltype(v)>(v, 1)) { std::cout << p << " "; } }

输出:

2 3 4


或更简单:

另一个现场演示链接。

#include <iostream> #include <vector> template <typename T> struct range_t { T b, e; range_t(T x, T y) : b(x), e(y) {} T begin() { return b; } T end() { return e; } }; template <typename T> range_t<T> range(T b, T e) { return range_t<T>(b, e); } int main() { std::vector<int> v{ 1, 2, 3, 4 }; for (auto p : range(v.begin()+1, v.end())) { std::cout << p << " "; } }

输出:

2 3 4
    

14
投票
这样做:

bool first = true; for (int p : colourPos) { if (first) { first = false; continue; } // ... }
    

0
投票
从 C++20 开始,您可以使用

std::span


for (int p : std::span(colourPos).subspan(1)) { ... }
这是迭代任何索引范围的简洁方法

[x, y)

© www.soinside.com 2019 - 2024. All rights reserved.