Jump to content

  • Log In with Google      Sign In   
  • Create Account


resizing a 2d vector.


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
7 replies to this topic

#1 black_darkness   Members   -  Reputation: 280

Like
0Likes
Like

Posted 31 December 2012 - 09:32 PM

Hello could you look at my objects and tell me what is wrong with them? The problem is I am trying to resize my 30x30 vector into a 60x60 vector. But it is wrong the first 30 vectors.

 

                wid_height[0] = 60;
                wid_height[1] = 60;
                mve.resize(wid_height[0], vector<Entity>(wid_height[1]));
                
//                init_map_entity_cleanup(mve,wid_height);
                init_map_home_entity(mve);
                init_map_home(cur_map,mve);

 

Here is image one. Size is 60 as I would like.

ex1.jpg

 

Here is image 2 showing all 60.

ex2.jpg

 

Here is image 3. There is a huge problem on the first 30 vectors. There vectors only have 30 vectors in them. So the first 30 vectors only have 30 vectors inside them instead of 60 like I need.

ex3.jpg

 

Now here is an image of the last 30 vectors 30-59. They have 60 vectors each so they are working properly.

 

ex4.png

 



Sponsor:

#2 RulerOfNothing   Members   -  Reputation: 1021

Like
1Likes
Like

Posted 31 December 2012 - 09:42 PM

The problem here is that you resize the vector and fill the new spaces with 60-element vectors, but you don't resize the first 30 vectors.

#3 black_darkness   Members   -  Reputation: 280

Like
0Likes
Like

Posted 31 December 2012 - 09:46 PM

The problem here is that you resize the vector and fill the new spaces with 60-element vectors, but you don't resize the first 30 vectors.

 

So that is the problem.


Could I solve this by making the vector size 0 then resize it the way I did in the beginning?



#4 RulerOfNothing   Members   -  Reputation: 1021

Like
1Likes
Like

Posted 31 December 2012 - 10:16 PM

Could I solve this by making the vector size 0 then resize it the way I did in the beginning?
That depends. Doing this will give you a vector containing 60 60-element vectors, but those vectors will not contain the data that was previously in the structure. If you want to keep the old data, you just need to loop over the vectors already present and resize them, then resize the top-level vector as before.

#5 Servant of the Lord   Crossbones+   -  Reputation: 14852

Like
5Likes
Like

Posted 31 December 2012 - 10:29 PM

It looks like (correct me if I'm wrong), that you're not using a 2D array at all.

 

Instead, you're using a vector of vectors, which is not a 2D array (it's an array of arrays). C++ doesn't have a built-in 2D vector.

Trying to massage a 'array of arrays' to behave like a 2D array is unnecessary labor. There are two far superior options:

  1. Use a 3rd party class (or make one yourself) that actually is a 2D array.
  2. Treat a 1D array (like std::vector) as a 2D array.

I usually go with the second option because it's so easy. Memory in RAM is one dimensional. 2D arrays would just line up a extra large 1D array of memory, and do some math to convert 2D coordinates to 1D coordinates. The math is very easy:

 

std::vector<Type> myArray(width * height);
 
int index = (y * width) + x;
myArray[index] = value;

 

Easy as pie. Here's the math explanation.


Edited by Servant of the Lord, 31 December 2012 - 10:29 PM.

It's perfectly fine to abbreviate my username to 'Servant' rather than copy+pasting it all the time.

[Fly with me on Twitter] [Google+] [My broken website]

All glory be to the Man at the right hand... On David's throne the King will reign, and the Government will rest upon His shoulders. All the earth will see the salvation of God.                                                                                                                                                       [Need free cloud storage? I personally like DropBox]

Of Stranger Flames - [indie turn-based rpg set in a para-historical French colony] | Indie RPG development journal


#6 black_darkness   Members   -  Reputation: 280

Like
0Likes
Like

Posted 01 January 2013 - 08:23 PM

It looks like (correct me if I'm wrong), that you're not using a 2D array at all.

 

Instead, you're using a vector of vectors, which is not a 2D array (it's an array of arrays). C++ doesn't have a built-in 2D vector.

Trying to massage a 'array of arrays' to behave like a 2D array is unnecessary labor. There are two far superior options:

  1. Use a 3rd party class (or make one yourself) that actually is a 2D array.
  2. Treat a 1D array (like std::vector) as a 2D array.

I usually go with the second option because it's so easy. Memory in RAM is one dimensional. 2D arrays would just line up a extra large 1D array of memory, and do some math to convert 2D coordinates to 1D coordinates. The math is very easy:

 

std::vector<Type> myArray(width * height);
 
int index = (y * width) + x;
myArray[index] = value;

 

Easy as pie. Here's the math explanation.

 

Thanks for this. I will try to read all this and implement it in my game. I have had more problems with vectors of vectors than anything else.



#7 black_darkness   Members   -  Reputation: 280

Like
0Likes
Like

Posted 02 January 2013 - 02:35 AM

It looks like (correct me if I'm wrong), that you're not using a 2D array at all.

 

Instead, you're using a vector of vectors, which is not a 2D array (it's an array of arrays). C++ doesn't have a built-in 2D vector.

Trying to massage a 'array of arrays' to behave like a 2D array is unnecessary labor. There are two far superior options:

  1. Use a 3rd party class (or make one yourself) that actually is a 2D array.
  2. Treat a 1D array (like std::vector) as a 2D array.

I usually go with the second option because it's so easy. Memory in RAM is one dimensional. 2D arrays would just line up a extra large 1D array of memory, and do some math to convert 2D coordinates to 1D coordinates. The math is very easy:

 

std::vector<Type> myArray(width * height);
 
int index = (y * width) + x;
myArray[index] = value;

 

Easy as pie. Here's the math explanation.

I implemented it like you described and it is so much faster. I guess running 10s of thousands of vectors a second is slower than running less than a 100 vectors a second. Thanks.



#8 Servant of the Lord   Crossbones+   -  Reputation: 14852

Like
0Likes
Like

Posted 02 January 2013 - 10:17 AM

Np, glad it helped.


It's perfectly fine to abbreviate my username to 'Servant' rather than copy+pasting it all the time.

[Fly with me on Twitter] [Google+] [My broken website]

All glory be to the Man at the right hand... On David's throne the King will reign, and the Government will rest upon His shoulders. All the earth will see the salvation of God.                                                                                                                                                       [Need free cloud storage? I personally like DropBox]

Of Stranger Flames - [indie turn-based rpg set in a para-historical French colony] | Indie RPG development journal





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS