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 allows time constant insertion and removal of elements.
It differs from list by the fact that forward_list keeps track of location of only next element while list keeps track to both next and previous elements.
The drawback of forward list is that it cannot be iterated backwards and its individual elements cannot be accessed directly.
Forward List is preferred over list when only forward traversal is required (same as 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 graph, etc.
Operations on Forward List :
Iterators
before_begin : Return iterator to before beginning (public member function )
begin : Return iterator to beginning (public member type )
end : Return iterator to end (public member function )
cbefore_begin : Return const_iterator to before beginning (public member function )
cbegin : Return const_iterator to beginning (public member function )
cend : Return const_iterator to end (public member function )
Capacity
empty : Test whether array is empty (public member function )
max_size : Return maximum size (public member function )
Element access
front : Access first element (public member function )
Modifiers
assign : Assign content (public member function )
emplace_front : Construct and insert element at beginning (public member function )
push_front : Insert element at beginning (public member function )
pop_front : Delete first element (public member function )
emplace_after : Construct and insert element (public member function )
insert_after : Insert elements (public member function )
erase_after : Erase elements (public member function )
swap : Swap content (public member function )
resize : Change size (public member function )
clear : Clear content (public member function )
Operations
splice_after : Transfer elements from another forward_list (public member function )
remove : Remove elements with specific value (public member function )
remove_if : Remove elements fulfilling condition (public member function template )
unique : Remove duplicate values (public member function )
merge : Merge sorted lists (public member function )
sort : Sort elements in container (public member function )
reverse : Reverse the order of elements (public member function )
Observers
get_allocator : Get allocator (public member function )
// C++ code to demonstrate forward list
// Function assign(), push_front(), emplace_front() and pop_front()
#include<iostream>
#include<forward_list>
using namespace std;
int main()
{
// Declaring forward list
forward_list<int> flist1;
// Declaring another forward list
forward_list<int> flist2;
// Assigning values using assign()
flist1.assign({1, 2, 3});
// Assigning repeating values using assign()
// 5 elements with value 10
flist2.assign(5, 10);
// 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;
// Inserting value using push_front()
// Inserts 4 at front
flist1.push_front(4);
// Displaying the forward list
cout << "The forward list after push_front operation : ";
for (int&c : flist1)
cout << c << " ";
cout << endl;
// Inserting value using emplace_front()
// Inserts 5 at front
flist1.emplace_front(5);
// Displaying the forward list
cout << "The forward list after emplace_front operation : ";
for (int&c : flist1)
cout << c << " ";
cout << endl;
// Deleting first value using pop_front()
// Pops 5
flist1.pop_front();
// Displaying the forward list
cout << "The forward list after pop_front operation : ";
for (int&c : flist1)
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 forward list after push_front operation : 4 1 2 3
The forward list after emplace_front operation : 5 4 1 2 3
The forward list after pop_front operation : 4 1 2 3
*/
// C++ code to demonstrate working of
// insert_after(), emplace_after() and erase_after()
#include<iostream>
#include<forward_list>
using namespace std;
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);
// Displaying the forward list
cout << "The forward list after erase_after operation : ";
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
*/
// C++ code to demonstrate working of remove() and remove_if()
#include<iostream>
#include<forward_list>
using namespace std;
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
*/
// C++ code to demonstrate working of splice_after()
#include<iostream>
#include<forward_list> // for splice_after()
using namespace std;
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
*/