|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
I am facing problem while erasing an elemet from stl vector when its
size is 2. It works fine when SIZE > 2. Can anybody me in this?? Following is the sample code which i tried. #include <iostream> #include <vector> using namespace std; #define SIZE 2 main() { vector<int> myVect; std::vector<int>::iterator iter; for(int i =0; i<SIZE; i++) myVect.push_back(i); cout<< myVect.size() << "\n"; for( iter = myVect.begin(); iter != myVect.end(); iter++) cout<< *iter << " "; cout<<"\n"; for( iter = myVect.begin(); iter != myVect.end(); iter++) { cout<< *iter << "\n"; if( *iter == 1) myVect.erase(iter); } return 0; } |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
Anil wrote:
> I am facing problem while erasing an elemet from stl vector when its > size is 2. It works fine when SIZE > 2. > Can anybody me in this?? Following is the sample code which i > tried. > > #include <iostream> > #include <vector> > > using namespace std; > #define SIZE 2 > main() > { > vector<int> myVect; > std::vector<int>::iterator iter; > > for(int i =0; i<SIZE; i++) > myVect.push_back(i); > > cout<< myVect.size() << "\n"; > for( iter = myVect.begin(); iter != myVect.end(); iter++) > cout<< *iter << " "; > > cout<<"\n"; > > for( iter = myVect.begin(); iter != myVect.end(); iter++) > { > cout<< *iter << "\n"; > if( *iter == 1) > myVect.erase(iter); > > } > > return 0; > } Calling erase invalidates any iterators pointing at or after the erased element. The canonical way to do this is, rather than ++iter in the loop: iter = myVect.erase(iter); Read footnote 5 here: http://www.sgi.com/tech/stl/Vector.html#5 Read about erase here: http://www.sgi.com/tech/stl/Sequence.html -Mark |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
"Anil" <anil.pundoor@gmail.com> wrote in message news:ca663000-10df-4d97-8c40-4f203820eea9@w40g2000hsb.googlegroups.com... >I am facing problem while erasing an elemet from stl vector when its > size is 2. It works fine when SIZE > 2. > Can anybody me in this?? Following is the sample code which i > tried. > > #include <iostream> > #include <vector> > > using namespace std; > #define SIZE 2 > main() > { > vector<int> myVect; > std::vector<int>::iterator iter; > > for(int i =0; i<SIZE; i++) > myVect.push_back(i); > > cout<< myVect.size() << "\n"; > for( iter = myVect.begin(); iter != myVect.end(); iter++) > cout<< *iter << " "; > > cout<<"\n"; > > for( iter = myVect.begin(); iter != myVect.end(); iter++) > { > cout<< *iter << "\n"; > if( *iter == 1) > myVect.erase(iter); > > } > > return 0; > } I think that calling erase above causes iter to become invalidated, so it's illegal to call iter++ on it afterwards, regardless of whether it seems to work on some vectors. The erase functions returns an iterator to the next item, so you can set iter to that when calling erase, and only incrementing when not calling erase. I believe there's also a std algorithm for this (remove_if or something like that, I forget). -Howard |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
On Wed, 5 Dec 2007 15:01:34 -0800 (PST), Anil wrote:
> main() > { Is there some popular course that mistakenly teaches declaring the main() function like that? Such line seems common in questions lately in this group. The proper minimal way to declare main(), is of course: int main() -- Joel Yliluoma - http://iki.fi/bisqwit/ |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
Joel Yliluoma wrote:
> On Wed, 5 Dec 2007 15:01:34 -0800 (PST), Anil wrote: >> main() >> { > > Is there some popular course that mistakenly teaches > declaring the main() function like that? Such line > seems common in questions lately in this group. > Welcome to India. |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
Anil wrote:
> I am facing problem while erasing an elemet from stl vector when its > size is 2. It works fine when SIZE > 2. > Can anybody me in this?? Following is the sample code which i > tried. > > #include <iostream> > #include <vector> > > using namespace std; > #define SIZE 2 > main() > { > vector<int> myVect; > std::vector<int>::iterator iter; > > for(int i =0; i<SIZE; i++) > myVect.push_back(i); > > cout<< myVect.size() << "\n"; > for( iter = myVect.begin(); iter != myVect.end(); iter++) > cout<< *iter << " "; > > cout<<"\n"; > for( iter = myVect.begin(); iter != myVect.end(); ) > { > cout<< *iter << "\n"; > if( *iter == 1) iter = myVect.erase(iter); else ++iter; > > } > > return 0; > } -- Jim Langston tazmaster@rocketmail.com |
|
![]() |
| Outils de la discussion | |
|
|