Try to avoid using macros. It is really bad habit. Anyone can argue about lots of macros used in MFC, ATL, boost and other places. But with using macros in most cases the code looks really bad and evil, and tends to become unmaintainable. Especially for making a better vector.erase or a better for(...) loop, is really NOT better. This is NOT a good example of using macros. There are lots of algorithms in STL which you can use instead. By the way, algorithms do not use macros.
If there is some good way to avoid macros, do NOT use macros. If you would like to make short expression shorter by using macros, then do NOT use macros. If you intend to use macros, do NOT use macros.
Usually macros is used for
1. Making some portable constructions, which may be platform and compiler dependent. In this case it is used with conditional compilation.
2. Avoid really big and bad sequences of code which are needed to use often. For instance different forwarders, handlers, callers, generators.
3. Creating some constructions which are not supported by compilers, for example such as lambdas or some kind of persistence, weird initialization sequences and so on
4. Creating aliases for magic constants, to avoid the magic in the code and make it more understandable. For instance S_OK instead of 0, or DISPID_GETDETAILSSTATE instead of 19
. Anyway here C++ offers better ways, such as declaring constants, and enumerations, with compile time control of the type.