C array | vector | deque | list |
|
---|---|---|---|---|
Insert/erase at start | n/a | linear | constant | constant |
Insert/erase at end | n/a | constant | constant | constant |
Insert/erase in middle | n/a | linear | linear | constant |
Access first element | constant | constant | constant | constant |
Access last element | constant | constant | constant | constant |
Access middle element | constant | constant | constant | linear |
Overhead | none | low | medium | high |
T(); T(const T&); ~T(); T& operator=(const T&);
#include < iostream.h > #include < vector.h > void print (vector < double >& vector_) { for (int i = 0; i < vector_.size (); i++) cout << vector_[i] << " "; cout << endl; } int main () { vector < double > v1; // Empty vector of doubles. v1.push_back (32.1); v1.push_back (40.5); vector< double > v2; // Another empty vector of doubles. v2.push_back (3.56); cout << "v1 = "; print (v1); cout << "v2 = "; print (v2); v1.swap (v2); // Swap the vector's contents. cout << "v1 = "; print (v1); cout << "v2 = "; print (v2); v2 = v1; // Assign one vector to another. cout << "v2 = "; print (v2); return 0; }output:
v1 = 32.1 40.5 v2 = 3.56 v1 = 3.56 v2 = 32.1 40.5 v2 = 3.56
operator[]
is a bit slower.
T(); T(const T&); ~T(); T& operator=(const T&);
#include < iostream.h > #include < deque.h > int main () { deque< int > d; d.push_back (4); // Add after end. d.push_back (9); d.push_back (16); d.push_front (1); // Insert at beginning. for (int i = 0; i < d.size (); i++) cout << "d[" << i << "] = " << d[i] << endl; cout << endl; d.pop_front (); // Erase first element. d[2] = 25; // Replace last element. for (i = 0; i < d.size (); i++) cout << "d[" << i << "] = " << d[i] << endl; return 0; }output:
d[0] = 1 d[1] = 4 d[2] = 9 d[3] = 16 d[0] = 4 d[1] = 9 d[2] = 25
operator[]
.
T(); T(const T&); ~T(); T& operator=(const T&); T* operator&();
int operator < (const T&, const T&); int operator==(const T&, const T&);
#include < iostream.h > #include < list.h > int array1 [] = { 9, 16, 36 }; int array2 [] = { 1, 4 }; int main () { list< int > l1 (array1, array1 + 3); list< int > l2 (array2, array2 + 2); list< int >::iterator i1 = l1.begin (); l1.splice (i1, l2); list< int >::iterator i2 = l1.begin (); while (i2 != l1.end ()) cout << *i2++ << endl; return 0; }output:
1 4 9 16 36
Container adaptors take sequence containers as their type arguments, for example:
stack < vector < int > > a;
- bool empty();
- size_type size();
- value_type& top();
- const value_type& top();
- void push(const value_type&);
- void pop();
- bool empty();
- size_type size();
- value_type& front();
- const value_type& front();
- value_type& back();
- const value_type& back();
- void push(const value_type&);
- void pop();
operator[]
is required.)
operator[]
.
- bool empty();
- size_type size();
- value_type& top();
- const value_type& top();
- void push(const value_type&);
- void pop();
insert(const &T)
returns a pair < rep_type::iterator, bool >
to indicate success or failure of a set/map insertion.
insert(const &T)
returns a pair < rep_type::iterator, bool >
to indicate success or failure of a set/map insertion.
operator[]
can be used like a non-scalar array index.
operator[]
.