Index: base/linked_list.h |
=================================================================== |
--- base/linked_list.h (revision 23831) |
+++ base/linked_list.h (working copy) |
@@ -5,7 +5,8 @@ |
#ifndef BASE_LINKED_LIST_H_ |
#define BASE_LINKED_LIST_H_ |
-// Simple LinkedList type. |
+// Simple LinkedList type. (See the Q&A section to understand how this |
+// differs from std::list). |
// |
// To use, start by declaring the class which will be contained in the linked |
// list, as extending LinkNode (this gives it next/previous pointers). |
@@ -47,6 +48,34 @@ |
// ... |
// } |
// |
+// Questions and Answers: |
+// |
+// Q. Should I use std::list or base::LinkedList? |
+// |
+// A. The main reason to use base::LinkedList over std::list is |
+// performance. If you don't care about the performance differences |
+// then use an STL container, as it makes for better code readability. |
+// |
+// Comparing the performance of base::LinkedList<T> to std::list<T*>: |
+// |
+// * Erasing an element of type T* from base::LinkedList<T> is |
+// an O(1) operation. Whereas for std::list<T*> it is O(n). |
+// That is because with std::list<T*> you must obtain an |
+// iterator to the T* element before you can call erase(iterator). |
+// |
+// * Insertion operations with base::LinkedList<T> never require |
+// heap allocations. |
+// |
+// Q. How does base::LinkedList implementation differ from std::list? |
+// |
+// A. Doubly-linked lists are made up of nodes that contain "next" and |
+// "previous" pointers that reference other nodes in the list. |
+// |
+// With base::LinkedList<T>, the type being inserted already reserves |
+// space for the "next" and "previous" pointers (base::LinkNode<T>*). |
+// Whereas with std::list<T> the type can be anything, so the implementation |
+// needs to glue on the "next" and "previous" pointers using |
+// some internal node type. |
namespace base { |