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()とほとんど同じように機能しますが、逆の順序で反復します。begin()end()

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

また、要素を変更するつもりがない場合は、代わりにconst_iterator(またはを使用する必要がありますconst_reverse_iterator

于 2013-03-21T05:36:55.957 に答える
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 に答える
0

それを達成するための非常に簡単な方法の1つは、次のとおりです。

// 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 fault が発生します。vector の要素は、 からアクセスできるシーケンスに含まれていbegin()ますend()-1。.end() は、コンテナーの最後の要素の「1 つ後」を指し、逆参照しないでください。

于 2013-03-21T05:31:11.080 に答える