(newbie need help) Problem with template vectors

M

Manuel

Hi!
This is a simple exercise with vectors. I must insert an element as
second item.

This work:

-------------------------------
#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<int> storage;
storage.push_back(10);
storage.push_back(20);
storage.push_back(30);
storage.push_back(40);
storage.push_back(50);
vector<int>::iterator iter = storage.begin();

storage.insert(iter + 2, 15);

while (iter != storage.end()) {
cout << *iter << endl;
iter++;
}
}
-------------------------------


This crash!!

-------------------------------
#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<int> storage;
storage.push_back(10);
storage.push_back(20);
storage.push_back(30);
storage.push_back(40);
//storage.push_back(50);
vector<int>::iterator iter = storage.begin();

storage.insert(iter + 2, 15);

while (iter != storage.end()) {
cout << *iter << endl;
iter++;
}
}
 
P

Peteris Krumins

Manuel said:
Hi!
This is a simple exercise with vectors. I must insert an element as
second item.

This work:

-------------------------------
#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<int> storage;
storage.push_back(10);
storage.push_back(20);
storage.push_back(30);
storage.push_back(40);
storage.push_back(50);
vector<int>::iterator iter = storage.begin();

storage.insert(iter + 2, 15);

while (iter != storage.end()) {
cout << *iter << endl;
iter++;
}
}

Because by inserting an element into a vector you invalidate the
iterator iter.
After: storage.insert(iter + 2, 15), iterator iter can no longer be
used.

Here is a an example which works:

#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<int> storage;
storage.push_back(10);
storage.push_back(20);
storage.push_back(30);
storage.push_back(40);
storage.push_back(50);

storage.insert(storage.begin() + 2, 15);

vector<int>::iterator iter = storage.begin();
while (iter != storage.end()) {
cout << *iter << endl;
iter++;
}
}


P.Krumins
 
M

Manuel

Peteris said:
Because by inserting an element into a vector you invalidate the
iterator iter.
After: storage.insert(iter + 2, 15), iterator iter can no longer be
used.


Thanks, and sorry to boring mailing list with stupid newbie questions...

Ciao!
 
B

benben

Manuel said:
Hi!
This is a simple exercise with vectors. I must insert an element as
second item.

This work:

-------------------------------
#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<int> storage;
storage.push_back(10);
storage.push_back(20);
storage.push_back(30);
storage.push_back(40);
storage.push_back(50);
vector<int>::iterator iter = storage.begin();

storage.insert(iter + 2, 15);

while (iter != storage.end()) {
cout << *iter << endl;
iter++;
}
}
-------------------------------


This crash!!

-------------------------------
#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<int> storage;
storage.push_back(10);
storage.push_back(20);
storage.push_back(30);
storage.push_back(40);
//storage.push_back(50);
vector<int>::iterator iter = storage.begin();

storage.insert(iter + 2, 15);

while (iter != storage.end()) {
cout << *iter << endl;
iter++;
}
}
-------------------------------

Why?? In both cases I've storage.size > 2...

THANKS!!!

Merry Christmas!

My guess is that iter is invalidated after the insert call. The first
example worked because you were lucky... To solve the problem, just
reassign storage.begin() to iter after the call to insert but before
using iter in any means:

int main() {
vector<int> storage;
storage.push_back(10);
storage.push_back(20);
storage.push_back(30);
storage.push_back(40);
//storage.push_back(50);

vector<int>::iterator iter = storage.begin();
cout << (iter == storage.begin()) << '\n'; // 1

storage.insert(iter + 2, 15);
cout << (iter == storage.begin()) << '\n'; // 0

iter = storage.begin(); // do this!

while (iter != storage.end()) {
cout << *iter << endl;
iter++;
}
}

Ben
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,012
Latest member
RoxanneDzm

Latest Threads

Top