• 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

    • Windows 7 its the peak of windows desktop experience, it felt polished, it was CONSISTENT, the UI was not something made to ###### people off it was more functional and productive because everything felt like a improvement. Windows 8 was horrible they did fix a little with 8.1 but the thing its that in usability it was the same as 7 you can avoid all the metro stuff, you don't need to use the cripple setting or metro stuff, for me it was bearable because it can be customized and you can make it like 7 (sure you waste time setting stuff) even if you needed a third party app. And there are serious performance improvement over 7 faster startup, Windows 10 was ok too nothing felt out of place and the start menu was usable it was filled with bloat but as usual you can remove it, what i really hated about 10 at that time it have worse windows update, you cant customize what update to install and the privacy and telemetry is horrible again it was bearable even but w11, not only they double down on things that i seriously hate on 10 like the bloat, they force changes that make no sense, make an worse start menu, worse context menu, worse task bar. force microsoft account. When i tried w10 iot enterprise LTSC on a ancient laptop, i felt that it was a throwback of what OLD windows should be a normal desktop OS with only the basics and you put the rest it was fast fluid functional, no nagging, its a productive, spend less time setting up the OS the way i want it. every windows after 7 its making it worse for me because i have to spend more time setting up
    • https://filepilot.tech/ File Pilot is a whole lot faster and offers a lot of the same features. Has a free beta available, but it looks like it's going to be a paid app in the future.
    • 24H2 was absolutely plagued with stability and compatibility problems, many of which are still not solved. You don't have to take my word for that either, given that Microsoft have an official know issues page available. Games using older versions of Easy Anti-Cheat still cause 24H2 to lock up and/or BSOD, and there's still a compatbility hold on upgrades if you have them installed as a result. Maybe 25H2 will be less of a dumpster fire, but I wouldn't count on it given Microsoft's recent track record.
    • No I don't also get my news for one source. Have you considered that maybe I just don't care about tech enough to spend time reading multiple sources? Anyway my website preferences are way off topic.
    • The bloat on windows after 7 was acceptable, but 11 its even worse than chinese android phone makers, because at least they can remove the ads or apps, but w11 shove you bloat with no option to remove it, it seems that 25h2 will fix that
  • Recent Achievements

    • Week One Done
      MIghty Haul earned a badge
      Week One Done
    • One Month Later
      MIghty Haul earned a badge
      One Month Later
    • Collaborator
      KD2004 earned a badge
      Collaborator
    • One Month Later
      ataho31016 earned a badge
      One Month Later
    • One Month Later
      Delahenty Machinery earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      594
    2. 2
      Michael Scrip
      200
    3. 3
      ATLien_0
      192
    4. 4
      +FloatingFatMan
      140
    5. 5
      Xenon
      127
  • Tell a friend

    Love Neowin? Tell a friend!