Open In App

Forward List in C++ | Set 1 (Introduction and Important Functions)

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

Forward list in STL implements singly linked list. Introduced from C++11, forward list are more useful than other containers in insertion, removal, and moving operations (like sort) and allow time constant insertion and removal of elements. 
It differs from the list by the fact that the forward list keeps track of the location of only the next element while the list keeps track of both the next and previous elements, thus increasing the storage space required to store each element. The drawback of a forward list is that it cannot be iterated backward and its individual elements cannot be accessed directly. 
Forward List is preferred over the list when only forward traversal is required (same as the singly linked list is preferred over doubly linked list) as we can save space. Some example cases are, chaining in hashing, adjacency list representation of the graph, etc.
Operations on Forward List:
 
1. assign(): This function is used to assign values to the forward list, its other variant is used to assign repeated elements and using the values of another list.

CPP




// C++ code to demonstrate forward list
// and assign()
#include <forward_list>
#include <iostream>
using namespace std;
 
// Driver Code
int main()
{
    // Declaring forward list
    forward_list<int> flist1;
 
    // Declaring another forward list
    forward_list<int> flist2;
   
    //Declaring another forward list
      forward_list<int> flist3;
 
    // Assigning values using assign()
    flist1.assign({ 1, 2, 3 });
 
    // Assigning repeating values using assign()
    // 5 elements with value 10
    flist2.assign(5, 10);
   
   
      //Assigning values of list 1 to list 3
      flist3.assign(flist1.begin(), flist1.end());
 
    // Displaying forward lists
    cout << "The elements of first forward list are : ";
    for (int& a : flist1)
        cout << a << " ";
    cout << endl;
 
    cout << "The elements of second forward list are : ";
    for (int& b : flist2)
        cout << b << " ";
    cout << endl;
   
       
      cout << "The elements of third forward list are : ";
    for (int& c : flist3)
        cout << c << " ";
    cout << endl;
 
    return 0;
}


Output

The elements of first forward list are : 1 2 3 
The elements of second forward list are : 10 10 10 10 10 
The elements of third forward list are : 1 2 3 

2. push_front(): This function is used to insert the element at the first position on forward list. The value from this function is copied to the space before first element in the container. The size of forward list increases by 1.
3. emplace_front(): This function is similar to the previous function but in this no copying operation occurs, the element is created directly at the memory before the first element of the forward list.
4. pop_front(): This function is used to delete the first element of the list.  

CPP




// C++ code to demonstrate working of
// push_front(), emplace_front() and pop_front()
#include <forward_list>
#include <iostream>
using namespace std;
 
// Driver Code
int main()
{
    // Initializing forward list
    forward_list<int> flist = { 10, 20, 30, 40, 50 };
 
    // Inserting value using push_front()
    // Inserts 60 at front
    flist.push_front(60);
 
    // Displaying the forward list
    cout
        << "The forward list after push_front operation : ";
    for (int& c : flist)
        cout << c << " ";
    cout << endl;
 
    // Inserting value using emplace_front()
    // Inserts 70 at front
    flist.emplace_front(70);
 
    // Displaying the forward list
    cout << "The forward list after emplace_front "
            "operation : ";
    for (int& c : flist)
        cout << c << " ";
    cout << endl;
 
    // Deleting first value using pop_front()
    // Pops 70
    flist.pop_front();
 
    // Displaying the forward list
    cout << "The forward list after pop_front operation : ";
    for (int& c : flist)
        cout << c << " ";
    cout << endl;
 
    return 0;
}


Output

The forward list after push_front operation : 60 10 20 30 40 50 
The forward list after emplace_front operation : 70 60 10 20 30 40 50 
The forward list after pop_front operation : 60 10 20 30 40 50 

5. insert_after(): This function gives us a choice to insert elements at any position in forward list. The arguments in this function are copied at the desired position.
6. emplace_after(): This function also does the same operation as the above function but the elements are directly made without any copy operation.
7. erase_after(): This function is used to erase elements from a particular position in the forward list. There are two variants of ‘erase after’ function.

CPP




// C++ code to demonstrate working of
// insert_after(), emplace_after()
// and erase_after()
#include <forward_list>
#include <iostream>
using namespace std;
 
// Driver Code
int main()
{
    // Initializing forward list
    forward_list<int> flist = { 10, 20, 30 };
 
    // Declaring a forward list iterator
    forward_list<int>::iterator ptr;
 
    // Inserting value using insert_after()
    // starts insertion from second position
    ptr = flist.insert_after(flist.begin(), { 1, 2, 3 });
 
    // Displaying the forward list
    cout << "The forward list after insert_after operation "
            ": ";
    for (int& c : flist)
        cout << c << " ";
    cout << endl;
 
    // Inserting value using emplace_after()
    // inserts 2 after ptr
    ptr = flist.emplace_after(ptr, 2);
 
    // Displaying the forward list
    cout << "The forward list after emplace_after "
            "operation : ";
    for (int& c : flist)
        cout << c << " ";
    cout << endl;
 
    // Deleting value using erase.after Deleted 2
    // after ptr
    ptr = flist.erase_after(ptr);
      cout << "The forward list after erase_after operation "
            ": ";
      // Displaying the forward list
      for (int& c : flist)
        cout << c << " ";
    cout << endl;
   
   
   
      // Deleting value in a range
      // another variant of erase which uses start and end iterator
      // and deletes all the values in between them
      ptr=flist.erase_after(flist.begin(), flist.end());
    cout << "The forward list after erase_after (range) operation "
            ": ";
      // Displaying the forward list
      for (int& c : flist)
        cout << c << " ";
    cout << endl; 
 
    return 0;
}


Output

The forward list after insert_after operation : 10 1 2 3 20 30 
The forward list after emplace_after operation : 10 1 2 3 2 20 30 
The forward list after erase_after operation : 10 1 2 3 2 30 
The forward list after erase_after (range) operation : 10 

8. remove(): This function removes the particular element from the forward list mentioned in its argument.
9. remove_if(): This function removes according to the condition in its argument. 

CPP




// C++ code to demonstrate
// working of remove() and
// remove_if()
#include <forward_list>
#include <iostream>
using namespace std;
 
// Driver Code
int main()
{
    // Initializing forward list
    forward_list<int> flist = { 10, 20, 30, 25, 40, 40 };
 
    // Removing element using remove()
    // Removes all occurrences of 40
    flist.remove(40);
 
    // Displaying the forward list
    cout << "The forward list after remove operation : ";
    for (int& c : flist)
        cout << c << " ";
    cout << endl;
 
    // Removing according to condition. Removes
    // elements greater than 20. Removes 25 and 30
    flist.remove_if([](int x) { return x > 20; });
 
    // Displaying the forward list
    cout << "The forward list after remove_if operation : ";
    for (int& c : flist)
        cout << c << " ";
    cout << endl;
 
    return 0;
}


Output

The forward list after remove operation : 10 20 30 25 
The forward list after remove_if operation : 10 20 

10. clear(): This function deletes all the elements from the list. 

C++




#include <forward_list>  // for using forward list
#include <iostream>
using namespace std;
  
int main()
{
      // creating forward list
    forward_list<int> flist{ 1, 2, 3, 4, 5 }; 
      
   
      //Printing forward list
      cout<<"Forward list: ";
      for(auto i: flist){
      cout<<i<<" ";
    }
      cout<<endl;
   
   
   
    flist.clear();
    // Forward List becomes empty
  
   
   
    // Printing the Forward list
      cout<<"Forward list after using clear function: ";
    for (auto it = flist.begin(); it != flist.end(); ++it)
        cout << ' ' << *it;
      cout<<endl;
   
   
    return 0;
}


Output

Forward list: 1 2 3 4 5 
Forward list after using clear function: 

11. splice_after(): This function transfers elements from one forward list to other.  

CPP




// C++ code to demonstrate working of
// splice_after()
#include <forward_list> // for splice_after()
#include <iostream>
using namespace std;
 
// Driver Code
int main()
{
    // Initializing forward list
    forward_list<int> flist1 = { 10, 20, 30 };
 
    // Initializing second list
    forward_list<int> flist2 = { 40, 50, 60 };
 
    // Shifting elements from first to second
    // forward list after 1st position
    flist2.splice_after(flist2.begin(), flist1);
 
    // Displaying the forward list
    cout << "The forward list after splice_after operation "
            ": ";
    for (int& c : flist2)
        cout << c << " ";
    cout << endl;
 
    return 0;
}


Output

The forward list after splice_after operation : 40 10 20 30 50 60 

Some More Methods of forward_list:

Method

Definition

front() This function is used to reference the first element of the forward list container.
begin() This function is used to return an iterator pointing to the first element of the forward list container.
end() This function is used to return an iterator pointing to the last element of the list container.
cbegin() Returns a constant iterator pointing to the first element of the forward_list.
cend() Returns a constant iterator pointing to the past-the-last element of the forward_list.
before_begin() Returns an iterator that points to the position before the first element of the forward_list.
cbefore_begin() Returns a constant random access iterator which points to the position before the first element of the forward_list.
max_size() Returns the maximum number of elements that can be held by forward_list.
resize() Changes the size of forward_list.
unique() Removes all consecutive duplicate elements from the forward_list. It uses a binary predicate for comparison.
reverse()  Reverses the order of the elements present in the forward_list.

For Second Set Refer to this Article – Forward List in C++ | Set 2 (Manipulating Functions)
 



Last Updated : 28 Nov, 2022
Like Article
Save Article
Share your thoughts in the comments
Similar Reads