It compiles and runs, but after "Here is the starting empty cubes vector" prints, I get this message:

Debug Assertion Failed!


Expression: vector subscript out of range

Can someone help me, please?

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;

// Cubed integers
class cubes
{
   int cube; // The vector position cubed
public:
   // Constructors
       cubes    ()      {cube = -1;}
       cubes    (int c) {cube = c * c * c;}

   int get_cube ()      {return cube;}
};

// Overloaded operators
bool operator< (cubes a, cubes b) {return a.get_cube() <  b.get_cube();}
bool operator==(cubes a, cubes b) {return a.get_cube() == b.get_cube();}


void show_vector  (vector<cubes> &v);
   // Show the vector specifications and contents


int main()
{
   vector<cubes> v;                       // A vector
   vector<cubes>::iterator p_v;          // An iterator
   vector<cubes>::reverse_iterator rp_v; // A reverse iterator
   unsigned int i;                       // Counter variable

   // Show the specs and contents of the starting vector
   cout << "\n\nHere is the starting empty cubes vector:";
   show_vector(v);

   // Add 6 cubes and show the vector
   cout << "\n\nAdding the first 6 cubes to the vector:";
   for(i = 0; i < 6; i++)
      v.push_back(cubes(i));
   show_vector(v);

   // Delete even cubes and show the vector
   cout << "\n\nDeleting the even cubes from the vector:";
   p_v = v.begin();
   for(i = 0; i < (int) v.size(); i++)
   {
      v.erase(p_v + i);
      p_v++;
   }
   show_vector(v);

   // Reinsert the even cubes and show the vector
   cout << "\n\nInserting the even cubes back into the vector:";
   p_v = v.begin();
   for(i = 0; i < (int) v.size(); i += 2)
      v.insert(p_v + i, v[i].get_cube());
   show_vector(v);

   // Add 4 cubes and show the vector
   cout << "\n\nAdding the next 4 cubes to the end of the vector:";
   p_v = v.end();
   for(i = 6; i <= 9; i++)
   {
      v.insert(p_v, v[i].get_cube());
      p_v++;
   }
   show_vector(v);

   // Add 4 empty cubes and show the vector
   cout << "\n\nAdding 4 empty cubes to the end of the vector:";
   for(i = 10; i <= 13; i++)
      v.push_back(cubes());
   show_vector(v);

   // Remove the empty cubes and show the vector
   cout << "\n\nRemoving the last 4 empty cubes from the vector:";
   for(i = 1; i <= 4; i++)
      v.pop_back();
   show_vector(v);

   // Show the vector contents in forward and reverse order
   cout << "\n\nPrinting the cubes with an iterator, then with a "
        <<     "reverse iterator:";
   for(p_v = v.begin(); p_v <= v.end(); p_v++)
      cout << "\n   " << p_v->get_cube() << " ";
   for(rp_v = v.rbegin(); rp_v <= v.rend(); rp_v++)
      cout << "\n   " << rp_v->get_cube() << " ";

   // Clear the vector
   cout << "\n\nRemoving all cubes from the vector:";
   v.clear();
   show_vector(v);

   return 0;
}

void show_vector(vector<cubes> &v)
{
   unsigned int i,       // Counter variable
                sum = 0; // The sum of the vector contents

   for(i = 0; i <= (int) v.size(); i++)
      sum += v[i].get_cube();

   cout <<  "  Size: "     << (int) v.size()
        << " - Sum: "      << sum
        << " - Capacity: " << v.capacity()
        << " - Max Size: " << v.max_size();
   cout <<  "  Cubes Vector contents: ";
   for(i = 0; i <= (int) v.size(); i++)
      cout << v[i].get_cube();
   return;
}

i think the error you are getting is on line 65. you are starting with the subscript 6 but i believe the vector has only 6 elements so the last subscript would be 5. why don't you just use push_back for each element instead of insert since you are adding them to the end of the vector.

Edited 6 Years Ago by NathanOliver: n/a

Thank you for your answer, but I changed the numbers you mention to 5 and 8, and I still get the same error at the same spot.

I am required to use insert where I do, or else I would definitely use push_back instead.

Edited 6 Years Ago by Phasa: n/a

   cout << "\n\nAdding the first 6 cubes to the vector:";
   for(i = 0; i < 6; i++)  
     {
    v.push_back(cubes(i)); 
    show_vector(v);

Edited 3 Years Ago by mike_2000_17: Fixed formatting

sorry for that:) i presed tab:). I think line 41 is your problem. A constructor does not return a type so i don't see what your v vector would contain.

alright i figured it out. it is from line 104. you have for(i = 0; i <= (int) v.size(); i++) when it should be for(i = 0; i //<// (int) v.size(); i++) since you are doing <= you will run to size when you actually want to stop after size - 1

Edited 6 Years Ago by NathanOliver: n/a

Sorry I forgot. This also applies to line 112. and one other thing on line you are using a iterator after you change the vector. A iterator to a vector is no longer usable after the vector has been changed. sorry but you are going to have another way to do this.

Edited 6 Years Ago by NathanOliver: n/a

Hi Nathan.You didn't say nothing about that constructor being pushed back into the vector. Am i wrong? Cause i trust you know better and i'm really curious.

at caut_baia

assuming we have class Foo

vector<Foo> bar
bar.push_back(Foo(1));

this is perfectly legal to do.

Edited 6 Years Ago by NathanOliver: n/a

Yes i know.I just skimmed too fast and failed to see that accessor being used .. get_cube().

This article has been dead for over six months. Start a new discussion instead.