1

我对开始和结束工作的方式感到有点困惑,他们在我看来是不一致的。当前进和后退时,他们有不同的行为。

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
4

4 回答 4

3

您应该使用反向迭代器

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";
}
于 2013-03-21T05:23:21.037 回答
3

请注意,它begin()指向向量的第一个元素,但end()指向最后一个元素。取消引用永远不安全end(),但您可以将迭代器与它进行比较。

如果向量为空,则begin() == end(),并且您不能取消引用任何一个。

循环遍历向量元素的一种更惯用的方法是:

for (vector<Actor*>::iterator i = a.begin(); i != a.end(); ++i) {
   // do something here
}

要反向迭代,使用rbegin()and更简单rend(),它的工作方式与 and begin()/大致相同end(),但以相反的顺序迭代:

for (vector<Actor*>::reverse_iterator i = a.rbegin(); i != a.rend(); ++i) {
   // do something here
}

此外,如果您不打算修改元素,则应使用 a const_iterator(orconst_reverse_iterator代替。

于 2013-03-21T05:36:55.957 回答
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";这会导致段错误。vector 的元素包含在可以从 访问 的序列begin()end()-1。.end() 指向“过去”容器的最后一个元素,不应取消引用。

于 2013-03-21T05:31:11.080 回答
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);
于 2013-03-21T05:47:31.697 回答