I have a std::map
, which I want to iterate over, starting at the second entry.
I can workaround this fine, but I'm confused about why the "obvious" syntax doesn't compile. The error message doesn't help, because it refers to std::string
, which I'm not using here.
Here's some code
// Suppose I have some map ...
std::map<int, int> pSomeMap;
// This is fine ...
std::map<int, int>::const_iterator pIterOne = pSomeMap.begin();
++pIterOne;
// This doesn't compile ...
std::map<int, int>::const_iterator pIterTwo = pSomeMap.begin() + 1;
Visual Studio 2012 gives the following error on the above line:
error C2784: 'std::_String_iterator<_Mystr> std::operator +
(_String_iterator<_Mystr>::difference_type,std::_String_iterator<_Mystr>)' :
could not deduce template argument for 'std::_String_iterator<_Mystr>' from 'int'
What's happening here?
std::map<T>::iterator
is of the iterator-class bidirectional iterator. Those only have ++
and --
operators. +N
and []
is only available for random access iterators (which can be found in e.g. std::vector<T>
).
The reason behind this is that adding N
to a random access iterator is constant time (e.g. add N*sizeof(T)
to a T*
), whereas doing the same thing for a bidirectional iterator would require applying ++
N
times.
What you can do though (if you have C++11) is:
std::map<int, int>::const_iterator pIterTwo = std::next(pSomeMap.begin(),1);
which does the right thing for all iterator types.
std::map
iterators are bidirectional, thus they provide only ++ and -- operators, but not operator+
, even if it is +1.
You can use std::advance
if you really need to simulate operator+, but that would result into sequence of increment being called for the iterator.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With