我想知道在输入迭代方向时是否有人想过如何迭代向量(或容器)的元素。
这是我能想到的第一件事:
std::vector<int> vec = {1, 2, 3, 4};
int direction = 1 // or -1;
int start = direction == 1 ? 0 : (int)arrs.size()-1;
for (int i=start; i<(int)vec.size() && 0<=i; i+=direction) {
// do your stuff
}
有没有人知道更好或更好的方法吗?
答案 0 :(得分:6)
我会这样,使用标准库算法并在适当的情况下反转迭代器。例如,
void foo(int i) { /* do stuff */ }
if (smth)
std::for_each(vec.begin(), vec.end(), foo);
else
std::for_each(vec.rbegin(), vec.rend(), foo);
答案 1 :(得分:1)
有没有人知道更好或更好的方法吗?
是:仅实现for循环体中的操作(荣誉之间的所有内容)。然后,将std :: for_each与一对迭代器一起使用。代码经过测试,稳定且惯用:
旧代码:
std::vector<int> vec = {1, 2, 3, 4};
int direction = 1 // or -1;
int start = direction == 1 ? 0 : (int)arrs.size();
for (int i=start; i<(int)vec.size() && 0<=i; i+=direction) {
// do your stuff
}
新代码:
auto your_stuff = [](const int& i) { /* do your stuff */ };
// forward iteration:
std::for_each(vec.begin(), vec.end(), your_stuff);
// backward iteration:
std::for_each(vec.rbegin(), vec.rend(), your_stuff);
答案 2 :(得分:0)
你的解决方案非常适合矢量。存在一些数据结构,其中这种迭代将太昂贵,例如,单链表。另一方面,你总是要使用STL容器迭代器。我相信还有一个后退迭代器。