我觉得开始和结束的工作方式让我感到有些困惑,他们认为我是不一致的。前进和后退时他们有不同的行为。
vector<Actor *> a;
a.push_back(new Actor(11));
a.push_back(new Actor(22));
a.push_back(new Actor(33));
vector<Actor *>::iterator it = a.begin();
int x =0;
while(a.begin()+x != a.end()){
cout << (*(a.begin()+x)) << "\n";
x++;
}
cout << "\n";
int y = 1; // if this is set to 0 then its a seg fault =/ when I access
while(a.end()-y != a.begin()){
cout << (*(a.end()-y)) << "\n";
y++;
}
输出
0x979a008
0x979a028
0x979a018
0
0x979a018
0x979a028
如何获得预期的模式
0x979a008
0x979a028
0x979a018
0x979a018
0x979a028
0x979a008
答案 0 :(得分:3)
您应该使用reverse iterators:
int y = 0;
while(a.rbegin() +y != a.rend()){
cout << (*(a.rbegin()+y)) << "\n";
y++;
}
或者更好的方法是使用迭代器本身的重载++
运算符:
auto iter = a.rbegin();
while(iter != a.rend()){
cout << *(iter++) << "\n";
}
答案 1 :(得分:3)
请注意,begin()
指向向量的第一个元素,但end()
指向超过最后一个元素。解除引用end()
永远不安全,但您可以将迭代器与它进行比较。
如果向量为空,则为begin() == end()
,您可能不会取消引用任何一个。
循环矢量元素的更惯用的方法是:
for (vector<Actor*>::iterator i = a.begin(); i != a.end(); ++i) {
// do something here
}
要反向迭代,使用rbegin()
和rend()
更简单,它的工作方式和begin()
/ end()
大致相同,但迭代顺序相反:< / p>
for (vector<Actor*>::reverse_iterator i = a.rbegin(); i != a.rend(); ++i) {
// do something here
}
另外,如果您不打算修改元素,则应使用const_iterator
(或const_reverse_iterator
代替。
答案 2 :(得分:0)
实现这一目标的一个非常简单的方法是遵循
// first element to the last
auto it = a.begin()
while (it != a.end())
{
cout<<*it<<"\n";
++it;
}
cout<<"\n"
// Last element to first
auto rit = a.rbegin()
while(rit != a.rend())
{
cout<<*rit<<"\n";
++rit;
}
注意:不要试图取消引用a.end()及其后的内容。在程序中y = 0
时,a.end()在行cout << (*(a.end()-y)) << "\n";
中被取消引用,这会导致seg错误。
向量元素包含在一个序列中,可以从begin()
到end()-1
访问。 .end()指向一个“过去”容器的最后一个元素,不应该被解除引用。
答案 3 :(得分:0)
std::for_each(a.begin(), a.end(), [](const Actor *& a){ std::cout << a; });
std::for_each(a.rbegin(), a.rend(), [](const Actor *& a){ std::cout << a; });
auto print_actor = [](const Actor *& a){ std::cout << a; };
std::for_each(a.begin(), a.end(), print_actor);
std::for_each(a.rbegin(), a.rend(), print_actor);