• 0

[C++] Array of Linked lists Help


Question

Recommended Posts

  • 0
  saiz66 said:
thanks Genesi!  I saved that, it looks to be very helpful. 

I used this declaration:  std::list<int> listArray[10]; 

Now how do I send this to a function as a reference? b/c I want the original to change from the new function.  Thanks!

void f (std::list&lt;int&gt;* myList)
{
 ? ?myList[0].push_back( /* something */ );
}

Hope that helps.

  • 0
  saiz66 said:
thanks bwx, but why do you use *? I am kind of confused, I thought you used & for reference.

I used a pointer because you can't really pass an array as a reference (since an array is implicitly a pointer). The other way you could do it is by using vector objects, but you said you haven't learned that yet so I'll leave that alone.

Hope that helps.

  • 0
  saiz66 said:
thanks bwx for the reply, are arrays the only thing u cant use as a reference or are there any others?

It's not so much that you can't pass arrays by reference, it's just that you can't pass them without pointers. Not unless you want to do some ugly hacking.

  saiz66 said:
Also how can I print all the elments from the list?

To get the value's stored in an std::list, you have to use iterators.

Here's an example:

#include &lt;iostream&gt;
#include &lt;list&gt;

int main (int argc, char **argv)
{
    std::list&lt;int&gt; intList;
    // insert some random numbers into the list
    intList.push_back(1);
    intList.push_back(5);
    intList.push_back(2);
    intList.push_back(4);

    // declare an iterator to iterate through the list and set it to the first element
    std::list&lt;int&gt;::iterator it = intList.begin();

    while (it != intList.end())
    {
        // Currently, 'it' acts as the index. When you dereference 'it', you get the value
        // contained at that index
        std::cout &lt;&lt; *it &lt;&lt; std::endl;

        // Increment the iterator to the next element
        ++it;
    }
    return 0;
}

I commented it the best I could. However, iterators may be a confusing topic so let me know if you don't understand anything.

  bithub said:
actually...

void function(int (&amp;arr)[5])

Granted, there really isnt any reason to pass an array by reference since it will act the same as passing it by value.

Well the array notation in the argument implicitly implies a pointer. All you're doing is passing the actual pointer as a reference. There are reasons to pass an array as a reference but they are very rare. The only reason I can think of is to modify the address pointed to by the pointer you're passing in to the function. For example if you're writing a function to free a block of memory, then zero out the pointer that was just deleted, you could pass the pointer as a reference and set it to zero from within the function and it will retain it's value when the function returns.

I hope that helps.

  • 0
  saiz66 said:
thnx so much for all the help... i am not sure why there is a need for an iterator.

To know why, you have to have some understanding on how linked lists are actually implemented. A linked list is usually a link of structures (can be classes as well) which contain a data variable and a pointer which points to the next element in the linked list. There are also bi-directional linked lists in which each link in the linked list also contains a pointer to the previous link therefore allowing you to go backwards aswell. Now that we're clear on what a linked list is, it is pretty obvious why it requires an iterator. When you first declare an iterator and assign it to the first element in the linked list, that first element has the pointer to the next element. When you increment it, the std::list class internally gets the address of the next link in the linked list through the first element's structure. It keeps doing the same thing with each link in the list until you reach the end. If std::list implemented a method to extract values from the linked list, it would have to iterate the whole list up to the index you specified everytime you requested a value, which is needless to say, rather inefficient.

I know all this is confusing, but it gets better as you go. The key to succeeding in programming is practice. ;)

I hope that helps.

  • 0

yup.. it makes more sense now... I am used to the linked list that we build ourselves. The one where you have a temporary pointer and stuff to traverse through the list. I didn't feel like building my own and thought to use the List from the library. thanks again, much appreciated!!!

  • 0
  saiz66 said:
Also, how would I make it so that when I am passing the array of linked list it won't be changed inside the fucntion? Adding a const infront?

Correct. Placing const will tell the complier that the values are not to be changed. If any attempt by your compiler trys to change them then you will get a error message.

  • 0

Thanks Genesi! I have a problem. I am trying to pass an array of linked list and I have it set as const such as

const list&lt;int&gt;* outstandingRequest

so that it won't change the array of linked lists. But I get an error in this part of the code:

list&lt;int&gt;::iterator it = outstandingRequests[i].begin();

Is that because, it is changing the code?

The error is:

  Quote
error C2440: 'initializing' : cannot convert from 'class std::list<int,class std::allocator<int> >::const_iterator' to 'class st
  • 0
  saiz66 said:
Thanks Genesi!? I have a problem.? I am trying to pass an array of linked list and I have it set as const such as

const list&lt;int&gt;* outstandingRequest

so that it won't change the array of linked lists.? But I get an error in this part of the code:

list&lt;int&gt;::iterator it = outstandingRequests[i].begin();

Is that because, it is changing the code?

The error is:

Since you're passing it as 'const', the array of lists is unchangeable while the iterator you're requesting is not.

Change

list&lt;int&gt;::iterator it = outstandingRequests[i].begin();

into

list&lt;int&gt;::const_iterator it = outstandingRequests[i].begin();

and it'll work fine.

Hope that helps.

  • 0
  bwx said:
Since you're passing it as 'const', the array of lists is unchangeable while the iterator you're requesting is not.

Change

list&lt;int&gt;::iterator it = outstandingRequests[i].begin();

into

list&lt;int&gt;::const_iterator it = outstandingRequests[i].begin();

and it'll work fine.

Hope that helps.

Thats what I meant to say. :p

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

    • No registered users viewing this page.
  • Posts

    • Using NASA’s IXPE telescope and a fleet of observatories, scientists discovered that the system’s intense X-rays don’t come from its glowing accretion disk as previously believed, but from a chaotic, high-speed wind of particles hurled out by the pulsar itself. The findings challenge old models and reveal a single, powerful mechanism behind the pulsar’s radiation. It’s a dramatic twist in our understanding of how dead stars can still light up the universe. A global team of astronomers has made a significant discovery about how the energetic remains of exploded stars interact with the space around them. Using NASA’s IXPE (Imaging X-ray Polarimetry Explorer) along with several other observatories, researchers gathered new insights into this dynamic cosmic behavior. The scientists, working across the United States, Italy, and Spain, focused their investigation on a puzzling stellar system known as PSR J1023+0038, or simply J1023. This system features a rapidly spinning neutron star that draws material from a smaller companion star. As a result, an accretion disk of matter has formed around the neutron star. The neutron star also functions as a pulsar, emitting intense beams of radiation from its magnetic poles as it spins, creating a pattern that resembles a lighthouse sweeping through space. What makes J1023 especially important is that it switches between two distinct phases. https://scitechdaily.com/nasa-just-discovered-where-these-mysterious-space-x-rays-really-come-from/    
    • Artifacts from the Iron Age have revealed an intense historical magnetic anomaly in the Middle East. Could using a similar approach elsewhere help us unravel the mysteries of Earth's magnetic field? Ben-Yosef, an archaeologist at Tel Aviv University, had been working in southern Jordan with Ron Shaar, who was analyzing archaeological materials around the Levant. Shaar, a geologist at The Hebrew University of Jerusalem, was building a record of the area's magnetic field. The hunk of copper slag — a waste byproduct of forging metals — they found recorded an intense spike in Earth's magnetic field around 3,000 years ago. Shaar worked hard to give them more evidence. After they had analyzed and described samples from around the region for more than a decade, the anomaly was accepted by the research community and named the Levantine Iron Age Anomaly (LIAA). From about 1100 to 550 B.C., the magnetic field emanating from the Middle East fluctuated in intense surges. https://www.livescience.com/archaeology/earths-magnetic-field-is-weakening-magnetic-crystals-from-lost-civilizations-could-hold-the-key-to-understanding-why
    • Designed by former F1 engineers. Pure danger. A company made up of former F1 racing engineers has unveiled an outrageous e-scooter that can reach a top speed of north of 100 miles per hour — and covers a whopping 150 miles on a single charge. The bizarre contraption, dubbed The Turbo, was developed by UK-based e-scooter company Bo, whose existing lineup targets the more premium end of the last-mile — or last 150 miles, in this case — mobility market. The Turbo's specs are borderline hard to believe. The metal-clad and girthy two-wheeler features a 24,000-watt dual-motor engine and an enormous 1,800-watt-hour battery. Aerodynamic air intakes funnel wind to keep everything cool. https://futurism.com/the-byte/100-mph-escooter-hazard    
    • Apple was waiting for Samsung to refine the technology. Now, they will ask Samsung to make their screen. Amazing...
  • Recent Achievements

    • Rookie
      Snake Doc went up a rank
      Rookie
    • First Post
      nobody9 earned a badge
      First Post
    • One Month Later
      Ricky Chan earned a badge
      One Month Later
    • First Post
      leoniDAM earned a badge
      First Post
    • Reacting Well
      Ian_ earned a badge
      Reacting Well
  • Popular Contributors

    1. 1
      +primortal
      495
    2. 2
      Michael Scrip
      203
    3. 3
      ATLien_0
      197
    4. 4
      Xenon
      136
    5. 5
      +FloatingFatMan
      116
  • Tell a friend

    Love Neowin? Tell a friend!