C++ List

Welcome to The Coding College! In this tutorial, we will dive into lists in C++, a powerful data structure provided by the Standard Template Library (STL). C++ lists are ideal for scenarios where frequent insertions and deletions are required.

What Is a List in C++?

A list in C++ is a doubly-linked list implemented in the STL. Unlike arrays or vectors, a list does not store elements in contiguous memory locations, allowing for:

  • Efficient insertion and deletion of elements at any position.
  • Slightly slower random access compared to arrays or vectors.

Features of C++ Lists

  • Dynamic Size: No need to specify the size at declaration.
  • Non-Contiguous Memory: Elements are stored as nodes, linked together with pointers.
  • Bidirectional Traversal: Supports both forward and backward iteration.

Declaring a List

To use a list, include the <list> header.

#include <list>
#include <iostream>
using namespace std;

int main() {
    list<int> myList; // Declare an empty list of integers
    list<string> myWords = {"Hello", "World"}; // Initialize a list with elements

    return 0;
}

Common Operations on Lists

1. Adding Elements

You can add elements at the front or back of a list using push_front and push_back.

#include <list>
#include <iostream>
using namespace std;

int main() {
    list<int> myList;

    myList.push_back(10);  // Add 10 to the back
    myList.push_front(5);  // Add 5 to the front

    for (int num : myList) {
        cout << num << " ";
    }

    return 0;
}

Output:

5 10 

2. Removing Elements

Use pop_front and pop_back to remove elements from the front or back.

#include <list>
#include <iostream>
using namespace std;

int main() {
    list<int> myList = {10, 20, 30};

    myList.pop_back();   // Remove the last element
    myList.pop_front();  // Remove the first element

    for (int num : myList) {
        cout << num << " ";
    }

    return 0;
}

Output:

20  

3. Insert and Erase Elements

  • insert: Insert an element at a specific position.
  • erase: Remove an element at a specific position.
#include <list>
#include <iostream>
using namespace std;

int main() {
    list<int> myList = {10, 20, 30};

    auto it = myList.begin(); // Iterator to the first element
    advance(it, 1);           // Move iterator to the second position

    myList.insert(it, 15);    // Insert 15 at the second position
    myList.erase(it);         // Remove the element at the iterator position

    for (int num : myList) {
        cout << num << " ";
    }

    return 0;
}

Output:

10 15 30  

4. Size of the List

The size() function returns the number of elements in the list.

#include <list>
#include <iostream>
using namespace std;

int main() {
    list<int> myList = {10, 20, 30};

    cout << "Size of the list: " << myList.size() << endl;

    return 0;
}

Output:

Size of the list: 3  

Iterating Through a List

You can iterate over a list using a range-based for loop or iterators.

Range-Based For Loop

#include <list>
#include <iostream>
using namespace std;

int main() {
    list<int> myList = {10, 20, 30};

    for (int num : myList) {
        cout << num << " ";
    }

    return 0;
}

Using Iterators

#include <list>
#include <iostream>
using namespace std;

int main() {
    list<int> myList = {10, 20, 30};

    for (list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {
        cout << *it << " ";
    }

    return 0;
}

Sorting and Reversing a List

1. Sorting

Lists can be sorted using the sort method.

#include <list>
#include <iostream>
using namespace std;

int main() {
    list<int> myList = {30, 10, 20};

    myList.sort(); // Sort the list in ascending order

    for (int num : myList) {
        cout << num << " ";
    }

    return 0;
}

Output:

10 20 30  

2. Reversing

Use the reverse method to reverse the order of elements in the list.

#include <list>
#include <iostream>
using namespace std;

int main() {
    list<int> myList = {10, 20, 30};

    myList.reverse(); // Reverse the list

    for (int num : myList) {
        cout << num << " ";
    }

    return 0;
}

Output:

30 20 10  

Removing Duplicates

The unique method removes consecutive duplicate elements.

#include <list>
#include <iostream>
using namespace std;

int main() {
    list<int> myList = {10, 10, 20, 30, 30};

    myList.unique(); // Remove consecutive duplicates

    for (int num : myList) {
        cout << num << " ";
    }

    return 0;
}

Output:

10 20 30  

Merging Two Lists

The merge method merges two sorted lists.

#include <list>
#include <iostream>
using namespace std;

int main() {
    list<int> list1 = {10, 20, 30};
    list<int> list2 = {15, 25, 35};

    list1.merge(list2); // Merge list2 into list1
    list1.sort();       // Sort the merged list

    for (int num : list1) {
        cout << num << " ";
    }

    return 0;
}

Output:

10 15 20 25 30 35  

Real-World Applications of Lists

  1. Task Scheduling: Store tasks with frequent insertions and deletions.
  2. Dynamic Data Storage: Manage dynamic datasets with unpredictable size changes.
  3. Undo/Redo Operations: Use a list to maintain the history of operations.

Summary

  • Advantages: Fast insertion/deletion, bi-directional traversal.
  • Limitations: Slower random access compared to arrays or vectors.
  • Functions: Use push_back, push_front, insert, erase, sort, reverse, etc.

Learn More at The Coding College

For more tutorials on C++ and STL data structures, visit The Coding College.

Leave a Comment