(If your vectors have a habit of becoming significantly smaller, there's shrink-to-fit.) And the typical case is likely to be Incorrect.
N3936 188.8.131.52 [deque.modifiers]/1: "An insertion at either end of the deque invalidates all the iterators to the deque, but has no effect on the validity of references to elements of the deque."I agree with all of your arguments, but my point is that deque has it's place as that was the OP's question.
One solution is keeping track of all the keys with a std::list is the only solution.std::deque can be manipulated at the front and even does so without invalidating iterators c.std::deque doesn't grow exponentially thus wasting less space and being less susceptible to a fragmented heap. std::deque may return memory when shrinking I'm sure there's more if I dug a bit. N3936 184.108.40.206 [deque.modifiers]/1: "An insertion at either end of the deque invalidates all the iterators to the deque, but has no effect on the validity of references to elements of the deque."I have to grumble at this, because "exponentially" usually means "bad", but in vector's context it's good.GOTW #54 ( makes some decent arguments in favour of using std::deque as a general purpose container - Recently however C pundits (Herb at GN2013) have changed tact, and the philosophy has now become: Use std::vector unless it can be proven something else is faster/more efficient.In the end is there really any need for std::deque and its complicated blocks-of-n linked list structure?I'm surprised that STL uses a chain of blocks.With the ring buffer approach, if your dequeue stays within a certain bound, you never need to allocate again once it gets up to size.Here is my try: Compiler: Default compiler Bezig met uitvoeren van g ..g "C:\Documents and Settings\Laptop\Mijn documenten\map test swapping.cpp" -o "nul" -Wall -Werror -Wformat -lalleg -lgmpxx -lgmp -I"C:\Dev-Cpp\lib\gcc\mingw32.4.2\include" -I"C:\Dev-Cpp\include\c .4.2\backward" -I"C:\Dev-Cpp\include\c .4.2\mingw32" -I"C:\Dev-Cpp\include\c .4.2" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib" C:\Documents and Settings\Laptop\Mijn documenten\map test swapping.cpp: In function `int main()': C:\Documents and Settings\Laptop\Mijn documenten\map test swapping.cpp:15: error: no match for 'operator ' in '(&List)- there some problem with you code I think: First : the map type's iterator doesn't support the " n" operator, the only why to change it is " "; Second: Even you tried three times, but according to the template declaration template void swap ( T& a, T& b ); the T is a typename , so it only changed the iterator only , the function do nothing Third : If you tried sway(* iterator, * interator), then compiler will show you a error, that the can not use the default assignment operator...If neither of these work, perhaps you are using the wrong data type. If you really need to do that, then map isn't the right container. Further, exchanging the pairs' seconds doesn't do anything to the map's internal storage.If you want to be able to do "iterator N" then you need a container that supports random access iterators. The order is only defined internally to be a linear, strict-weak, increasing ordered set. (Copy constructors work wonders.) It is not incongruous to modify a key's associated value.