Sign in to follow this  
Bozebo

Unity [solved] pointer from stl list iterator?

Recommended Posts

edit: this problem is solved, I am now asking for help here. Hi, firstly I will show an example application that represents my issue:
class cell{
  public:
    float top,left,bottom,right;

  //other methods and members

};

list<cell> cellList;
list<cell>::iterator cellIter;

//finds the cell that a point is in and returns a pointer to the cell
cell* findCell(float x,float y){
  for(cellIter = cellList.begin();cellIter != cellList.end();cellIter++){
    //if point is inside the cell
    if(x<=cellIter->right && x>=cellIter->left && y<=cellIter->top && y>=cellIter->bottom){
      break; //break the loop
    }
  }
  
  return (*cellIter);
}



I want findCell to return a pointer to the cell. Firstly I have to say that iterators confuse me a bit, they seem to be neither one thing nor the other, in the loop they work just like a pointer, but I can't return the iterator as the pointer, and I can't type cast it (tried a few other things untill I landed on the return line above). Also, cellList does not alter within the main loop, it is only edited on map initialisation. I really don't want to be passing object data around everywhere as that would be inefficient. (if it matters, I am programming this to learn how occlusion and collision grouping can be organised in an fps engine) What is the correct solution? Or should I find a different way to do the same task? edit: I found some discussions which spoke about the boost library, boost may shine light on any problems I have with lists of pointers but does it help me with this issue? [Edited by - Bozebo on April 25, 2010 8:30:44 PM]

Share this post


Link to post
Share on other sites
Quote:
Firstly I have to say that iterators confuse me a bit, they seem to be neither one thing nor the other,
in the loop they work just like a pointer, but I can't return the iterator as the pointer, and I can't type cast it (tried a few other things untill I landed on the code above).
As you note, although iterators can behave like pointers in some ways, they are not themselves pointers. (Well, strictly speaking, they might be in some cases, but as far as the user is concerned they have their own type, and aren't necessarily convertible to 'real' pointers.)

In this case though, you should be able to write:
return &(*cellIter);
Here, the 'deference' operator for the iterator is invoked, returning a reference to the pointed-at object. You can then take the address of the object as you would normally.

[Edit: I don't know that the Boost libraries have any direct relevance to the problem, as this is really just a basic issue of understanding how to use and manipulate iterators. I'll also mention that there are some other potential design issues here - such as the passing around of raw pointers, the brute-force search through the list of cells, and the use of list rather than, say, vector - that might warrant some examination once you get the basics working.]

Share this post


Link to post
Share on other sites
struct is_inside {
is_inside(float x_, float y_) : x(x_), y(y_) {}
bool operator()(cell & c) {
return (x >= c.left &&
x < c.right &&
y >= c.bottom &&
y < c.top);
}
private:
float x, y;
}

...
typedef std::list<cell> CellList;
CellList cellList;

CellList::iterator result = std::find_if(cellList.begin(), cellList.end(), is_inside(x,y));
if (result == cellList.end()) {
// not found
} else {
// result is first found cell
}




To find all cells that contain the point:
CellList::iterator result = cellList.begin();
while (result != cellList.end()) {
result = std::find_if(result, cellList.end(), is_inside(x,y));
if (result != cellList.end()) {
// (x,y) is inside result
}
}




Share this post


Link to post
Share on other sites
Quote:
Original post by Antheus
*** Source Snippet Removed ***

To find all cells that contain the point:
*** Source Snippet Removed ***
I'm not sure that those code samples address the OP's question. The OP was asking specifically about how to derive a pointer from a list iterator, which doesn't seem to be addressed at all in the above code samples.

Of course using algorithms from the standard library (as shown in your example code) is arguably preferable to writing out the loop manually, but I think that in most practical applications you'd want to use some sort of spatial hierarchy for this anyway (in other words, you probably wouldn't want to use a brute-force linear search for this, regardless of how the code for the search is written).

Share this post


Link to post
Share on other sites
Thanks for the help.

It is working nicely now, and I remembered that my cells are maintaining a list of adjacent cells (as is the map format). Rather than looping through all cells I should of definitely make it check only adjacent cells.

I thought about using vectors for that but I didn't see any reason to at the time. Is it that vectors are sequentially indexed (faster random access vs slower middle insertion) which makes them a better choice?

Should I use vectors or lists for my entities?
Noting that I need to order translucent drawing.

Should I maintain entities and their drawing system separately?

I love working on projects like this :D

(edit: oh now I have a segfault to deal with ^_^)

[Edited by - Bozebo on April 25, 2010 2:24:59 PM]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Partner Spotlight

  • Forum Statistics

    • Total Topics
      627661
    • Total Posts
      2978496
  • Similar Content

    • By Jcyshadow97
      Hi,guys.I m working on a Fantasy RPG.Currently i m work alone on the project.I really need someone can make UI stuff.If someone can handle it please feel free to contact me on email: 270514974@libero.it.
      Thank you guys and sorry for my english.
       
       



    • By STRATUM the Game
      Hey, everyone! This is my first post here.
      I would like to know what you think about my project called STRATUM. It's a 2D platformer that is heavily based on storytelling and boss fighting while trekking through the world.

      Everything in STRATUM takes place in the first century AD, in a world that wraps our own universe, called  The Stratum. A parallel Universe that is the home of the Christian deities . In this game you will play as a Dacian warrior, unfamiliar with everything in this world, you’ll get to know and understand The Stratum together with him.
      The main thing that I want with STRATUM is to reinvent the known lore and history of the Christian deities and realms. 
      The story is unconventional, it plays down a lot of the mysticism of Hell or Heaven and it gives it a more rational view while keeping the fantastic in it. What do I mean by that? Well, think about Hell. What do you know about it? It's a bad place where bad people go, right? Well, that's not the case in STRATUM. I don't want to describe such a world. In STRATUM, there is a reason for everything, especially for the way Hell is what it is in the game. "Hell" is called The Black Stratum in the game.
      This world is not very different from Earth, but it is governed by different natural laws.
      The story will also involve the reason why this world entered in touch with ours.

       
      What do you think about all that I said? Would you be interested in such a game? I have to say that everything is just a work of fiction made with my imagination. I do not want to offend anyone's beliefs.
      I want this to be a one man game. I have been working alone on it (this was my decision from the beginning) from art to effects to programming to music to sound effects to everything.
      I also have a youtube video HERE if you want to see the way the game moves and the way my music sounds.
      Please, any kind of feedback will be highly appreciated. If you have something bad to say, do it, don't keep it for yourself only. I want to hear anything that you don't like about my project.
       
    • By LimeJuice
      Hi, it's my first post on this forum and I would like to share the game I am working on at the moment.
      Graphics have been made with Blender3D using Cycle as a renderer and I am using Unity3D. It's a 2D game, one touch side-scrolling game for iOS and Android.
      Here some pictures, and you can have a look to the gameplay on this video :
      Feedbacks ?
      And if you want to try it, send me your email and I will add you to the beta tester list!
       
       








    • By Kirill Kot
      An adventure indie game with quests in a beautiful, bright world. Characters with unique traits, goals, and benefits. Active gameplay will appeal to players found of interactivity, especially lovers of quests and investigations.
      Available on:
      Gameroom (just open the web page and relax)
      AppStore
      GooglePlay
      WindowsPhone

    • By Kirill Kot
      Big Quest: Bequest. An adventure indie game with quests in a beautiful, bright world. Characters with unique traits, goals, and benefits.
      Mobile game, now available on Gameroom. Just open the web page and relax.
  • Popular Now