• 0

[MFC] changing size of array at runtime?


Question

9 answers to this question

Recommended Posts

  • 0

I prefer to use STL for things like this when dealing with (personal preference).

example: An array that will hold a bunch of integers would be coded something like this:

#include <vector.h>
#include <iostream.h>
using namespace std; //to make the "No std::"-nazi's happy.

int main(int argc, const char * argv[])
{
 ?bool runLoop = true;
 ?vector myVector<int>;

 ?// First let's add some items to the array
 ?while(runLoop)
 ?{
 ? ?int temp;
 ? ?cout << "Enter a number (-99 quits): " << flush;
 ? ?cin >> temp;
 ? ?myVector.push_back(temp);
 ? ?if (temp == -99) runLoop = false;
 ?}
 ?myVector.pop_back(); ?// this line is needed to erase the "-99" in the last position.
 ?
 ?// lets print out the size of the vector, and then it's contents.
 ?cout << "\n\nThe size of myVector (vector) is: " << myVector.size() << endl << endl<< flush;
 ?for (int i = 0; i < myVector.size(); i++) cout << "element " << i << " is: " myVector[i];
  return 0;
}

Written here so it may not compile exactly as printed but I'm sure you get the idea. Vectors are nice because you can access them like a stanard array (array[index]), you can add/remove items to/from the end with ease, and you can use the STL routines to sort them.

Not as nice as NSMutableArray in Objective-C but it's not too bad either.

  • 0

I've done vector of vectors before, works fine and everything but if you prefer to use c-style memory management you can a)use a resize function (Which i believe is included) b)write your own.

vector< vector<int> > aliens;

//now to give memory to each vector of aliens
//makes something similar to aliens[5][11];
aliens.resize(5);
    for (int n=0;n<5;n++)
        aliens[n].resize(11);

  • 0

thanks, got vectors working now.

but i still cant get it to resize:

i can make it smaller and it works perfectly, however as soon as i try to make it bigger than its orrignal bounds i get a access violation

my code is:

decleration:

std::vector< std::vector<bool> > grid;
	std::vector< std::vector<bool> > newgrid;

resize function:

void Gbg::Resize(int x, int y)
{
	grid.resize(x);
	newgrid.resize(x);	
    for (int i=0;i<x;i++)
	{
  grid[i].resize(y);
  newgrid[i].resize(y);
	}


   for (int j=gx;j<x;j++)
   {
  for (int l = gy; l < y; l++)
  {
 	 grid[j][l] = false;
 	 newgrid[j][l] = false;
  }
   }

	gx = x;
	gy = y;
}

  • 0

try this, its much more elegant anyways. Think of an iterator as a pointer.

this is off top of my head. hope its right. :p

// This resizes it all accordingly

aliens.resize(2000000);
for (vector < vector<CAlien> >::iterator i = aliens.begin(); i <aliens.end(); i++)
{
        i->resize(10000);
}

// This performs an action() on every item in the list

for (vector< vector<CAlien> >::iterator i=aliens.begin(); i < aliens.end(); i++)
{
     for (vector<CAlien>::iterator it = i->begin(); it < i->end(); it++)
     {
               it->action();
     }
}

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.