std::list is a container that supports constant time insertion and removal of elements from anywhere in the container. Fast random access is not supported. It is usually implemented as a doubly-linked list.
someday, probably soon, you will have to work in a language that does not have built in data structures. Many do not. What will you do then? Learning to write a list will also let you build a tree or graph, neither of which are in C++ for you. The knowledge on how to do this is useful in many places, from other languages to extending what you know for new ideas.
what is the difference between std::list and linked list
A "linked list" is a generic term for a dynamic data structure that uses pointers to connect the contained elements (nodes) in a chain. std::list is a specific container implementation of that generic idea.
A linked list can be be implemented as:
1. a "doubly-linked" list with nodes that contain two pointers to the previous and next nodes in the list. Allows for iterating through the container bidirectionally.
2. a "singly-linked" list that consists of nodes that typically contain a single pointer to the next node of the list. Allows for iterating the container in one direction.
On the theory side of linked lists there is a third variation, known as a "circular linked list." Instead of having discrete head and tail nodes that mark the beginning and end of the list the pointers "wrap around" so the head and tail nodes point to each other.
Hand-rolling a linked list is a good learning experience, but that IMO is not something a beginner needs to contend with. Learning how to USE a linked list should be first priority, with what C++ has to offer. Learning how to construct a linked list is an intermediate task once one becomes familiar with the concept.
as far as alternates go, there is also the skip-list, which has extra pointers so instead of ->next you may have ->next1000, to make large jumps until you get closer to the item you are searching for (really only useful if the list is ordered) or even by say a first letter (skip to first item with next letter in a alpha-sorted list to speed up search).
one of the best things about vectors is using push_back as 'new' and swap/pop_back() as 'delete'. The index is the 'pointer' so it can be saved and loaded instead of rebuilt. Then you have a hidden vector that your pointer soup container is built from, which can be iterated faster and in alternate ways, or saved directly to a binary file in one write operation, etc. Very practical to use them on the back-end of list/tree/graph/etc.