13

std::map2 番目のエントリから繰り返し処理したい があります。

私はこれをうまく回避できますが、「明白な」構文がコンパイルされない理由について混乱しています。エラー メッセージは、ここでは使用していない を参照しているため、役に立ちませんstd::string

ここにいくつかのコードがあります

// 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 では、上記の行で次のエラーが発生します。

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'

ここで何が起こっているのですか?

4

2 に答える 2

22

std::map<T>::iteratoriterator クラスの双方向 iteratorです。++それらにはand--演算子しかありません。+Nであり、ランダム アクセス イテレータ[]でのみ使用できます(これは、たとえば にあります)。std::vector<T>

この背後にある理由はNランダム アクセス イテレータへの追加は定数時間 (たとえば、N*sizeof(T)a への追加T*) であるのに対し、双方向イテレータで同じことを行うには時間を適用する必要があるためです++ N

ただし、できること (C++11 を使用している場合) は次のとおりです。

std::map<int, int>::const_iterator pIterTwo = std::next(pSomeMap.begin(),1);

これは、すべてのイテレータ タイプに対して正しいことを行います。

于 2013-07-05T08:28:41.873 に答える
6

std::mapイテレータは双方向であるため、+1 であっても ++ および -- 演算子のみを提供しますoperator+。本当に operator+ をシミュレートする必要がある場合に
使用できますが、その結果、反復子に対して一連のインクリメントが呼び出されます。std::advance

于 2013-07-05T08:28:14.257 に答える